【问题标题】:JPA Entity updating database without persist/merge没有持久/合并的 JPA 实体更新数据库
【发布时间】:2014-09-02 09:40:50
【问题描述】:

我们的 Java 应用程序正在使用 Toplink JPA 将数据访问层连接到我们的 SQL Server 2008 数据库。

我们可以毫无问题地查询数据库并获得我们的结果。问题是,如果我们尝试更改返回的实体,它会在调用 setter 后立即保存到数据库中。

Query rQuery = em.createNamedQuery("Region.findAll");
Region r= rQuery.getResultList();
r.setActive(active);

从我们在 JPA 上阅读的内容来看,它似乎不应该在调用 persist/merge/flush 之前将更改发送到数据库。这是我们希望拥有的行为。我们希望能够进行所有更改,然后一次性发送所有更改。如果我们一次发送一个,但出现错误,我们最终可能会得到部分更新的记录。

我尝试将实体管理器刷新模式设置为提交,以强制它在持久化之前等待提交调用,但没有任何区别。

em.setFlushMode(FlushModeType.COMMIT);

我也尝试在调用 setter 之前分离返回的实体,但它会引发异常。

java.lang.AbstractMethodError: oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.detach(Ljava/lang/Object;)

这是我们第一次使用 Toplink JPA,我们不知道还能尝试什么。 如果有人对如何解决此问题有任何其他建议,我将不胜感激。

【问题讨论】:

    标签: java entity-framework hibernate jpa toplink


    【解决方案1】:

    如果您对实体的更新代码是在标有事务的方法中完成的,那么在该方法结束时将提交更改,因为事务必须在关闭之前提交任何更改。

    如果实体已分离,则使用合并,您对该实体进行了一些更改,您需要再次重新附加它并合并数据库中的更新。

    解决方案是使用事务属性“Require_new”以不同的方法查询数据,并将结果集传递给使用事务属性“必需”或“强制”进行更新的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2013-08-26
      • 2016-06-10
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多