【发布时间】:2011-09-30 10:34:21
【问题描述】:
我使用 jpa 和 hibernate (3.2.7) 作为 orm 实现。 我有一个实体被修改然后合并。 我在这个实体上也有一个@EntityListeners 以确保某些属性被重视。
如果我在合并之前更改了一个值,然后在 Listener 内的 @PreUpdate 方法中更改回该值,设置原始值,我在实体结果上的版本会增加,但在数据库版本上具有以前的值。 我认为这是由于对象没有改变,所以在 db 上它没有更新,但实体上的版本已经增加而在刷新后没有恢复。
为了更好地解释,我有这个对象:
@Entity
@EntityListeners({MyListener.class})
public class MyEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String myValue;
@Version
private Long version ;
}
还有这个监听器:
public class MyListener {
@PreUpdate
public void preUpdate(MyEntity ua) {
ua.setMyValue("default");
}
}
现在假设我在 db 上有一个具有以下值的对象:(id=1, myValue='defalut', version=1)。我读取了这个对象,分离,将它传递给客户端并使用 myValue='new' 将其取回并执行合并操作(侦听器将 myValue 更改为'default',因此对象结果未修改为 db),刷新并退出事务(所以承诺)。 之后,我在我的对象上找到 version=2,但在 db 上找到 version=1。
这是一个休眠错误吗?还是 Jpa 错误?
【问题讨论】:
-
您能谈谈您的方法调用层次结构和调用顺序吗?也许您的合并方法在更新方法之前起作用。
-
我猜 hibernate 脏检查返回 false 所以你的对象不会触及数据库(没有生成更新查询),但是当你第一次调用 setter 时,hibernate 可能会增加你的版本字段。恕我直言,版本字段仅应在更新值写入数据库时递增。这可能是一个休眠错误。