没有得到更新记录:Hibernate

时间:2014-07-28 12:11:35

标签: hibernate jpa

我正在使用EntityManger.persist(Object)将数据保存在数据库中。 然后我只是通过设置对象属性来更新记录。即Object.setProperty()将更新DB中的属性。 现在,如果我为此Object选择查询,我将再次查看旧的Object而不是更新的Object

请建议。

1 个答案:

答案 0 :(得分:0)

这里的具体答案取决于您的背景,但总的来说:

当您对某个对象执行em.persist()或从数据库中检索某个对象时,此对象将是managed所谓的Hibernate。这意味着Hibernate将跟踪对象状态,transactiontransaction时,committed内对对象所做的任何更改都将自动保留(取决于您的flush mode设置位。)

managed对象的生命周期可能比transaction长,这意味着transaction已完成,但该对象仍然被引用,并且仍然可以更改。然后会发生的是对象变为detached,这基本上意味着Hibernate不再自动跟踪其状态。对detached对象所做的任何更改都需要明确重新引入Hibernate,以便再次生成对象managed,并将对象的值存储在数据库中

这里发生的是您正在对detached对象进行更改,并且仍然期望它表现为managed对象。解决方案是重做您的事务,以便您在事务中发生所有更改(因此在managed对象上,而不是detached),或通过调用重新引入detached对象em.merge()将其作为参数。 merge - 方法实际上不会使managed中传递的对象(它仍为detached),而是返回与managed对应的detached对象作为参数输入的对象。