【发布时间】:2016-09-17 18:19:37
【问题描述】:
我知道已经有一些关于这个主题的问题,但我认为这个问题有所不同。
假设我有这个课程:
@Entity
public class foo{
@Id
@GeneratedValue
private long id;
@Version
private long version;
private String description;
...
}
我创建了一些对象并使用 JPA add() 将它们保存到数据库中。
稍后,我使用 JPA all() 从存储库中获取所有内容; 从该列表中,我选择一个对象并更改描述。
然后我想使用 JPA merge() 更新存储库中的那个对象(参见代码)。
这里的问题是它在我第一次尝试更改描述时起作用(版本值现在是 2)。 第二次,一个 OptimisticLockException 被抛出,表明该对象同时被改变了。
我正在使用 H2,在嵌入式模式下拥有 DB。
合并代码:
//First: persist is tried, if the object already exists, an exception is raised and then this code is executed
try {
tx = em.getTransaction();
tx.begin();
entity = em.merge(entity);
tx.commit();
} catch (PersistenceException pex) {
//Do stuff
}
哪里出了问题?
谢谢。
编辑(更多代码)
//Foo b 是通过使用 JPA all() 从 db 中获取所有对象获得的,然后从该列表中选择一个对象
b.changeDescription("新的东西!");
//调用更新方法(合并代码已贴)
【问题讨论】:
-
你试过用 em.persist 代替 merge 吗? merge 方法在更新后继续跟踪对象。根据您的配置方式,更新可能已经进入数据库。
-
发布更多代码。相关的是您如何加载和修改实体以及如何调用您发布的代码。
-
@AlanHay 我用更多代表我的情况的代码编辑了原始帖子
-
@fhofmann 我编辑了回答您问题的“合并代码”。