PrePersist方法无法在JPA中保存修改后的值

时间:2012-01-04 19:38:56

标签: hibernate jpa

有人可以解释为什么以下不起作用吗?

我有一个域对象,其中包含多个包含复杂POJO的瞬态字段。保存comain对象时,我想将这些对象序列化为XML(使用Xstream),并将它们存储到我的数据库中的PersistentMap中。

所以我在我的域对象上创建一个@ PrePersist / @ PreUpdate方法,并在这些方法中序列化这些值并将它们放入域对象的持久映射中。当调用persist时,我可以看到值被序列化,地图得到更新,但保存的实际值是原始值,而不是更新的值。

我的假设是,由于PrePersist / PreUpdate方法中发生了更改,因此底层持久性提供程序(在我的情况下为Hibernate 3)在调用PrePersist / PreUpdate方法之前确定域中已更改的字段,因此当实际保存完成后,原始值永远不会更新。

任何人都可以告诉我如何使这项工作?除了PrePersist / PreUpdate挂钩之外,我还能使用其他一些机制吗?

任何指针都会非常感激。

由于

2 个答案:

答案 0 :(得分:2)

如果只有瞬态值改变,Hibernate将不会认为对象已经改变,因此不会调用@PreUpdate

答案 1 :(得分:1)

我能够让这个工作的唯一方法是实际改变事件的状态。

String[] names = event.getPersister().getPropertyNames();
for (int i=0; i < names.length; i++) {
    if ("myProperty".equals(names[i])) {
        event.getState()[i] = getMyProperty();
    }
}