这是关于更新数据库中对象的Hibernate / JPA问题。
我有一个使用entityManager.persist(object)在另一个事务中创建的对象。
返回此对象,然后更新某些值。然后在另一个使用@Transactional注释的方法中进行调用。此方法调用基类中的合并方法(如下所示)。
在以下代码中,rvalue具有修改后的信息,直到调用刷新为止。调用刷新后,数据将恢复为原始值。
我希望对flush()的调用会将信息保存到数据库中。
我尝试评论刷新调用,认为保存不会发生,直到我将方法包装在事务中。但是,我仍然发现这些变化并没有持续下去。
对于可能发生的事情的任何想法将不胜感激!
@Override
public T merge(T object) {
T rvalue = entityManager.merge(object);
entityManager.flush();
entityManager.refresh(rvalue);
return rvalue;
}
答案 0 :(得分:8)
我弄清楚问题是什么。事实证明这个问题与entityManager或@Transaction设置没有关系。这是实体。我试图更新的其中一个字段标记为updatable = false。一旦我找到并更改了该参数,一切都很好。我习惯在定义它的getter上的@Column注释上看到这个设置,但发现它在派生类中被@AttributeOverride注释覆盖了。
虽然事实证明这是一个简单而不复杂的理由和修复,但实现目标的途径却存在问题。在我的所有故障排除中(单步执行代码,打开Hibernate和Spring的日志等等),我没有遇到由于此约束导致更新失败的任何异常。
答案 1 :(得分:1)
Merge创建实体的新实例,从提供的实体复制状态,并管理新副本。您传入的实例将不会被管理(您所做的任何更改都不会成为交易的一部分 - 除非您再次调用合并)。
来源is Here
答案 2 :(得分:0)
我遇到了这个问题,因为我调用了session.setDefaultReadOnly(true);。在休眠会话上。