在拦截器上更新父亲

时间:2009-10-16 16:49:52

标签: hibernate interceptor

我的模特:

 public class Father {
  Set<Son> sons = new HashSet<Son>();
  String name = null;
  Date lastSonModifyDate = null;
  // ... other fields and setters/getters
 }
 public class Son {
  Father father = null;
  String name = null;
  Date lastModifyDate = null;
  // ... other fields and setters/getters
 }

用例:

  1. 在数据库中有一个Father对象与Son对象关联(bidir)。
  2. 从DB father加载。
  3. 更新父亲的姓名字段。
  4. 更新儿子的名称字段。
  5. 坚持父亲。
  6. 我的拦截器首先检测父更新(onFlushDirty)。然后为儿子执行onFlushDirty。在这种情况下,我更新了son.lastModifyDate 以及father.lastSonModifyDate

    执行结束时,除father.lastSonModifyDate 外,所有更新都会保留。我认为这是因为父在会话中并且在儿子之前已经更新,所以这个实体会覆盖对子实体的onFlushDirty方法所做的更改。

    我怎样才能达到我的标记(从儿子拦截器设置父亲的lastSonModifyDate)?

    感谢。

2 个答案:

答案 0 :(得分:0)

你做不到。对于集合元素之后调用onFlushDirty()已为所有者调用它,并且更新操作(如果有)已经被调度。

你有没有理由不能在你的DAO中完成上述所有操作而不是依靠拦截器?或者在数据库级别(映射生成的lastModifyDate属性)?

答案 1 :(得分:0)

您需要为具有级联选项的实体覆盖onCollectionUpdate。这是在安排之前调用的。

欢呼声〜