我有一个休息的应用程序,其中一个资源可以更新.以下是负责实现此任务的两种方法:

> updateWithRelatedEntities(String,Store):接收通过反序列化PUT请求实体构造的id和新对象Store,在新对象上设置版本(用于乐观锁定),并在事务中调用更新.

public Store updateWithRelatedEntities(String id,Store newStore) {

Store existingStore = this.get(id);

newStore.setVersion(existingStore.getVersion());

em.getTransaction().begin();

newStore = super.update(id,newStore);

em.getTransaction().commit();

return newStore;

}

> update(String,T):进行更新的通用方法.检查ids匹配并执行合并操作.

public T update(String id,T newObj) {

if (newObj == null) {

throw new EmptyPayloadException(type.getSimpleName());

}

Type superclass = getClass().getGenericSuperclass();

if (superclass instanceof Class) {

superclass = ((Class) superclass).getGenericSuperclass();

}

Class type = (Class) (((ParameterizedType) superclass).getActualTypeArguments()[0]);

T obj = em.find(type,id);

if (!newObj.getId().equals(obj.getId())) {

throw new IdMismatchException(id,newObj.getId());

}

return em.merge(newObj);

}

问题是这个调用:T obj = em.find(type,id);触发数据库中存储对象的更新,这意味着我们在触发合并时获得OptimisticLockException(因为版本现在不同).

为什么会发生这种情况?实现这一点的正确方法是什么?

我不想将属性从newStore复制到existingStore,并使用existingStore进行合并 – 我认为这将解决乐观锁定问题.

此代码未在应用程序服务器上运行,并且我没有使用JTA.

编辑:

如果我在调用update之前分离existingStore,T obj = em.find(type,id);不会触发store对象的更新,这样可以解决问题.问题仍然存在 – 为什么当实体不分离时它会触发它?

java merge_java – OptimisticLockException当使用JPA merge()相关推荐

  1. java中的jpa_在JPA中处理Java的LocalDateTime

    java中的jpa 几天前,我在处理JPA中的LocalDateTime属性时遇到问题. 在这篇博客文章中,我将尝试创建一个样本问题来说明该问题以及我使用的解决方案. 考虑以下实体,该实体为特定公司的 ...

  2. java jinq_将JINQ与JPA和H2一起使用

    java jinq 几天前,我读了Iu Ming-Yee对JINQ的有趣采访 . 顾名思义,JINQ是一种尝试提供类似于LINQ for Java的尝试. 基本思想是缩小在关系数据模型上执行查询的面向 ...

  3. java中的jpa_JPA教程–在Java SE环境中设置JPA

    java中的jpa JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate之类的 ...

  4. JPA教程–在Java SE环境中设置JPA

    JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate的 ORM工具的东西,除了 ...

  5. Java文档阅读笔记-JPA Tutorial

    目录 JPA Tutorial JPA Intrduction JPA Object Relational Mapping Types of Mapping JPA Tutorial JPA(Java ...

  6. java框架mangedv,Spring集成JPA后,报“Not an managed type: class x.x.x

    以前的Spring脚手架项目,因业务需要,是基于多数据源 and不同方言的数据库的,对于普通项目过于复杂了, 于是重新搭了个单数据源的,用STS新建完毕,这是项目目录, 加上配置之后,先列下appli ...

  7. java企业开发四:ssh+JPA(hibernate实现)

    在java企业开发三:struts2+spring3再集成hibernate4基础上使用JPA规范,将Service底层也使用JPA API. 前话:集成JPA(ibernate4实现)使用org.s ...

  8. java中如何引入mergesort.mergesort_mergesort Merge Sort 问题

    归并排序中算法MergeSort()是怎么回事? void MergeSort(int R[],int low,int high) { int mid; if(low Merge Sort 问题 #i ...

  9. JAVA入门[20]-Spring Data JPA简单示例

    Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...

最新文章

  1. WaveSwipeRefreshLayout
  2. 贝佐斯成功拉下马斯克,NASA把SpaceX的独家登月合同暂停了
  3. AI创业公司最佳「开发工具」指南火了,还发现了个可挑战Jupyter的「杀手」
  4. hbuilder/hbuilderx 无法检测到模拟器
  5. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )
  6. Linux下route add 命令加入路由列表
  7. CTFHUB《Web-信息泄露-备份文件下载》网站源码,
  8. SSH集成log4j日志环境
  9. 安卓应用安全指南 翻译完成
  10. android返回键返回指定目录,Android 返回键返回到指定的Activity
  11. pyQt4导入问题:ImportError: No module named PyQt4
  12. 面试官交流中的问题与后感
  13. android拖拽 字体变形,17种文字变形的创意方法
  14. 集合切分:List集合按照数量切分成若干个集合
  15. svg怎么转换成png格式?
  16. 云端虚拟机规格参数快速对比说明
  17. 为什么网上工商银行安装了U盾不能上网站了?
  18. qt qled_OLED与QLED:有什么区别?
  19. 用mysql关联4个表_MySQL多表操作
  20. C# 简单的操作其他程序

热门文章

  1. Confluence 6 数据中心的 SAML 单点登录最佳实践和故障排除
  2. CSS3 background-clip属性
  3. python中实现switch
  4. C# Unity依赖注入
  5. poj2635 同余定理 + 素数筛法
  6. 蓝牙 MultipeerConnectivity
  7. 【推荐】2016年不得不读的九本好书
  8. CSS:CSS+JS制作可折叠内容块
  9. 加深认识与理解ADO.NET
  10. 【测试】软件测试用例设计