这是关于更新数据库中对象的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; }
Todd Patch.. 8
我弄清楚问题是什么.事实证明这个问题与entityManager或@Transaction设置没有关系.这是实体.我试图更新的其中一个字段标记为updatable = false.一旦我找到并更改了该参数,一切都很好.我习惯在定义它的getter上的@Column注释上看到这个设置,但发现它在派生类中被@AttributeOverride注释覆盖了.
虽然这是一个简单而不复杂的原因和修复,但实现目标的途径却存在问题.在我的所有故障排除中(单步执行代码,打开Hibernate和Spring的日志等等),我没有遇到由于此约束导致更新失败的任何异常.
我弄清楚问题是什么.事实证明这个问题与entityManager或@Transaction设置没有关系.这是实体.我试图更新的其中一个字段标记为updatable = false.一旦我找到并更改了该参数,一切都很好.我习惯在定义它的getter上的@Column注释上看到这个设置,但发现它在派生类中被@AttributeOverride注释覆盖了.
虽然这是一个简单而不复杂的原因和修复,但实现目标的途径却存在问题.在我的所有故障排除中(单步执行代码,打开Hibernate和Spring的日志等等),我没有遇到由于此约束导致更新失败的任何异常.