我们的 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,我们不知道还能尝试什么。 如果有人对如何解决此问题有任何其他建议,我将非常感激。
最佳答案
如果您对实体的更新代码是在标有事务的方法中完成的,则在该方法结束时将提交更改,因为事务必须在关闭之前提交任何更改。
如果实体已分离,您对该实体进行了一些更改,并且需要重新附加它并将更新合并到数据库中,则使用合并。
解决方案是使用事务属性“Require_new”在不同的方法中查询数据,并将结果集传递给使用事务属性“required”或“mandatory”进行更新的方法。
关于java - JPA实体更新数据库而不需要持久/合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24703224/