我正在使用EntityManger.persist(Object)
将数据保存在数据库中。
然后我只是通过设置对象属性来更新记录。即Object.setProperty()
将更新DB中的属性。
现在,如果我为此Object
选择查询,我将再次查看旧的Object
而不是更新的Object
。
请建议。
答案 0 :(得分:0)
这里的具体答案取决于您的背景,但总的来说:
当您对某个对象执行em.persist()
或从数据库中检索某个对象时,此对象将是managed
所谓的Hibernate
。这意味着Hibernate
将跟踪对象状态,transaction
为transaction
时,committed
内对对象所做的任何更改都将自动保留(取决于您的flush mode
设置位。)
managed
对象的生命周期可能比transaction
长,这意味着transaction
已完成,但该对象仍然被引用,并且仍然可以更改。然后会发生的是对象变为detached
,这基本上意味着Hibernate
不再自动跟踪其状态。对detached
对象所做的任何更改都需要明确重新引入Hibernate
,以便再次生成对象managed
,并将对象的值存储在数据库中
这里发生的是您正在对detached
对象进行更改,并且仍然期望它表现为managed
对象。解决方案是重做您的事务,以便您在事务中发生所有更改(因此在managed
对象上,而不是detached
),或通过调用重新引入detached
对象em.merge()
将其作为参数。 merge
- 方法实际上不会使managed
中传递的对象(它仍为detached
),而是返回与managed
对应的detached
对象作为参数输入的对象。