【问题标题】:EntityManager performs UPDATE to database automatically when I change a field of Embedded object, but do not call merge or flush当我更改嵌入式对象的字段时,EntityManager 自动执行数据库更新,但不调用合并或刷新
【发布时间】:2013-06-18 10:32:00
【问题描述】:

我有一些 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)

【问题讨论】:

    标签: java database jpa eclipselink entitymanager


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。 em.clear() 仍然会导致更新 - 但分离工作正常。我发现的另一个解决方案 - 不要做改变 bean 方法中的字段的工作 - 我已经在控制器中完成了它。所以我终于可以合并这个对象了。
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2016-08-23
    • 2013-04-28
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多