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



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

日志文件显示一些神秘的后台刷新进程:

begin unit of work flush    
Execute query UpdateObjectQuery ...

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

我的机器(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)

如果您想要对象但不希望更改被持久化,则需要使用em.detach(entity)(如果使用JPA 2.0)或em.clear()(如果您想要删除所有内容)将其从EntityManager中分离出来。回滚事务与清算或关闭EntityManager非常相似。分离的实体只有在合并回EntityManager时才会保留更改。

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

最新更新