0

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

日志文件讲述了一些神秘的后台刷新过程:

begin unit of work flush    
Execute query UpdateObjectQuery ...

我可以避免这种更新使 em.setFlushMode(FlushModeType.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)

4

1 回答 1

2

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

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

于 2013-06-21T12:37:01.293 回答