【问题标题】:Update father on interceptor在拦截器上更新父亲
【发布时间】:2009-10-16 16:49:51
【问题描述】:

我的模特:

 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. 在 DB 中有一个 Father 对象与一个关联的 Son 对象 (bidir)。
  2. 从数据库父亲加载。
  3. 更新父亲的姓名字段。
  4. 更新儿子的姓名字段。
  5. 坚持父亲。

我的拦截器首先检测到父亲更新(onFlushDirty)。然后为儿子执行 onFlushDirty。在这种情况下,我更新了 son.lastModifyDate 以及father.lastSonModifyDate

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

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

谢谢。

【问题讨论】:

    标签: hibernate interceptor


    【解决方案1】:

    你不能。 onFlushDirty() 为集合元素调用它已为所有者调用并且更新操作(如果有)已被安排。

    你有什么理由不能在你的 DAO 中完成上述所有操作,而不是依赖拦截器?还是在数据库级别(映射两个 lastModifyDate 属性作为生成)?

    【讨论】:

    • 我不能在 DAO 中这样做,因为 Son 对象通常是由父亲对象的级联保存/更新的......所以我无法控制它。也许数据库级别是一个不错的解决方案。但是,“生成”意味着数据库引擎创建时间戳?真的我需要以具体格式设置日期属性,任何数据库引擎都不支持...
    • 不确定您所说的“由级联更新......所以我无法控制它”是什么意思。如果你的 DAO 中有一个updateFather() 方法,那么有什么办法可以阻止你在调用 session.update()之前 为你想要的任何实体添加时间戳?就数据库而言,“具体格式”是什么意思?日期是日期(时间/时间戳,等等),它就是这样保存的。在你的应用中如何格式化它是一个完全不同的故事。
    • 好的,首先,我几乎从不为 Son 对象调用 DAO.saveOrUpdate,而只为父对象调用...级联)。其次,恐怕我对日期字段还没有完全真诚:实际上,Father.lastSonModifyDate 和 Son.lastModifyDate 代表日期,但它们的类型是 String,因为使用 String DateFormatter 来读取和写入它们的值......这是因为格式是我“不支持”的原因。
    • 我不是这个意思。当您从业务(服务)层调用 dao.save(father) 时,为什么不能在调用 session.saveOrUpdate(father) 之前更新父实例和相应的子实例?就 lastModifyDate 而言,您是否将它们作为字符串存储在数据库中?为什么?那只是自找麻烦。但是,如果这是您无法更改的遗留模式,那么绝大多数数据库都有某种 date_format() 函数可以根据您的格式呈现日期。
    • 是的,我想我会像你说的那样做。真的我不知道为什么我们使用字符串作为日期,这不是我的决定......也许我们应该改变它。感谢您的回答。问候。
    【解决方案2】:

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

    干杯~

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多