有人可以解释为什么以下不起作用吗?
我有一个域对象,其中包含多个包含复杂POJO的瞬态字段。保存comain对象时,我想将这些对象序列化为XML(使用Xstream),并将它们存储到我的数据库中的PersistentMap中。
所以我在我的域对象上创建一个@ PrePersist / @ PreUpdate方法,并在这些方法中序列化这些值并将它们放入域对象的持久映射中。当调用persist时,我可以看到值被序列化,地图得到更新,但保存的实际值是原始值,而不是更新的值。
我的假设是,由于PrePersist / PreUpdate方法中发生了更改,因此底层持久性提供程序(在我的情况下为Hibernate 3)在调用PrePersist / PreUpdate方法之前确定域中已更改的字段,因此当实际保存完成后,原始值永远不会更新。
任何人都可以告诉我如何使这项工作?除了PrePersist / PreUpdate挂钩之外,我还能使用其他一些机制吗?
任何指针都会非常感激。
由于
答案 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();
}
}