【问题标题】:problem while updating object using jpa使用 jpa 更新对象时出现问题
【发布时间】:2011-08-10 05:36:15
【问题描述】:

我在尝试使用 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.

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

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

但我不记得上次我是否做了其他事情。即使在添加了这个刷新语句之后,我也会收到这个错误。

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

【问题讨论】:

  • 在 openJPA 中,我从未设法对同一个实体进行 2 次操作。试试

标签: java jpa openjpa


【解决方案1】:

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

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

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

执行此操作的安全方法是关闭 Session 并使用 load 或 get,并确保您不更改 version 属性(假设您有这样的事情)

这通常不是您想要做的,如果您只在线程上工作,那么会话中的实体应该是最新的。因此,也许只是确保在合并就足够了时不要更改版本:从会话加载或获取实体,将版本存储在变量中,执行合并,重置版本和刷新/提交可能会起作用。

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

【讨论】:

    【解决方案2】:

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

    <openjpa.RuntimeUnenhancedClasses=unsupported/>
    

    如果这不能让你继续前进,你需要发布你的实体以获取更多关于正在发生的事情的线索。

    -瑞克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      相关资源
      最近更新 更多