当我更改Embedded对象的字段时,EntityManager会自动对数据库执行UPDATE,但不要调用merge或flush

时间:2013-06-21 10:16:04

标签: java database jpa eclipselink entitymanager

我有一些bean方法会导致对数据库的意外更新。 我只执行select语句并根据我的需要重新计算某些字段的值,但不希望它自动更新。 如何在不干预默认应用程序设置的情况下控制此过程?

日志文件说明了一些神秘的背景刷新过程:

begin unit of work flush    
Execute query UpdateObjectQuery ...

我可以避免这种更新制作em.setFlushMode(FlushModeType.COMMIT);在我的方法。这在我的机器上真的很奇怪这个工作正常 - 在方法执行期间和之后没有更新。但是在客户端机器上我还需要还原事务 - 只有在这种情况下我才会在日志中看到任何更新语句。但这种治疗方法是否正确?当我在bean方法中更改FlushMode for EM时,其他线程会执行自动提交吗?

我的机器(GlassFish 2.0,Ubuntu 12.10,eclipcelink 3.2,jdk 1.7.0_15)

客户端计算机(GlassFish 2.0,Win 7 x86_64,eclipcelink 3.2,jdk 1.7.0_15)

1 个答案:

答案 0 :(得分:2)

如果您想要对象但不希望保留更改,则需要使用em.detach(实体)将其与EntityManager分离(如果使用JPA 2.0或em.clear(),如果您希望删除所有内容)。回滚事务与清除或关闭EntityManager几乎相同。如果将它们合并回EntityManager,则分离的实体将仅保留更改。

如果不使用JTA,您也可以在事务外进行读取。如果EM未与事务关联,则无法刷新更改。通过这种方式,您可以使用与事务无关的EM,并在完成后丢弃EntityManager。