java - JPA实体更新数据库而不需要持久/合并

标签 java entity-framework hibernate jpa toplink

我们的 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/

相关文章:

java - 如何在 Hibernate 中修复 'A rollback database operation after a JUnit test'(没有 Spring)?

java - Spring boot - 应用程序无法启动无法打开架构管理目标的 JDBC 连接

java - 出现空指针异常。为什么?

java - @SuppressWarnings 用于最终类型参数

entity-framework - 是否可以将 Entity Framework 与 Windows Azure 开发存储服务一起使用?

entity-framework - 使用 DateTime 和 TimeSpan net core 2.0 和 EF 的算术值

c# - 引用 DNXCore5 错误,StringComparer .NET5

java - contains() 与泛型类型

java - 如何获取已在 Java Servlet 上下文中设置的全局对象

java - 共享带有注释的类