使用jpa更新对象时出现问题

时间:2011-04-21 10:59:11

标签: java jpa openjpa

我在尝试使用jpa.AM持久化对象时遇到以下错误

NestedThrowables:
<openjpa-1.2.2-SNAPSHOT-r422266:778978M-OPENJPA-975 nonfatal store error> org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance "org.apache.openjpa.enhance.com$ibm$cloud$bss$client$db$data$Offeringattribute$pcsubclass-com.ibm.cloud.bss.client.db.data.Offeringattribute-10013800" to the data store.  This indicates that the object was concurrently modified in another transaction.

现在我上次通过插入一些flush语句解决了这个错误,如下所示

em.persist(xyz);
em.flush(); //added this line
dbAttr.setOid((xyz.getId());
em.merge((xyz);

但是我不记得上次我是否做了别的事情。即使在添加这个刷新声明后也出现了这个错误。

注意:我正在运行我的应用程序作为独立的控制台应用程序,并确保只有一个线程正在运行

2 个答案:

答案 0 :(得分:1)

您正在运行子类化,并且存在许多已知问题。首先,请阅读有关enhancing your entities的此页面。它不应该花费超过几分钟,从长远来看,你将是一个更快乐的露营者。该链接的网络是您需要设置以下属性并使用另一种增强方法。

<openjpa.RuntimeUnenhancedClasses=unsupported/>

如果这不能帮助您,您需要发布您的实体以获取有关正在发生的事情的更多线索。

-Rick

答案 1 :(得分:0)

如果您尝试更新自加载后由某人/其他人更新的记录,则会发生乐观锁定异常。这不需要多个线程发生。

您应该能够解决在修改和保存实体之前重新加载实体的问题。

----更新回答问题---

这样做的安全方法是关闭Session并使用load或get,并确保不更改version属性(假设你有这样的东西)

通常这不是您想要做的,如果您只使用on thread,那么会话中的实体应该是最新的。因此,可能只是确保在合并足够时不更改版本:从会话加载或获取实体,将版本存储在变量中,执行合并,重置版本以及刷新/提交可能有效。

如果不是,我需要更多信息,关于你实际在做什么。