【发布时间】:2014-05-20 20:05:38
【问题描述】:
我的 HibernateInterceptor 出现问题。我扩展了EmptyInterceptor 并覆盖了onFlushDirty 方法。
我使用这种方法手动检查脏值(将以前的值与当前值进行比较)来为更改的实体编写审计日志。
问题是,在某些特定情况下,会在调用postFlush 方法之前多次将同一实体传递给onFlushDirty 方法。以前的值和当前值不会因调用而改变。所以我的审计日志多次写入相同的更改。
如果我的实体的属性发生更改(例如,从 NEW 到 IN_PROGRESS),则此更改将传递两次或多次到 onFlushDirty。
为什么会这样?这是真正奇怪的行为,我认为这不是预期的。
拦截器onFlushDirty的调用是由Hibernate的auto-flush行为引起的。在会话期间执行查询时,它会刷新会话中的所有脏实体。我希望这对脏实体只执行一次,但似乎即使在刷新之后该实体仍被标记为“脏”。然后在会话中再次执行另一个查询 - 再次刷新实体。旧值和当前值与第一次刷新时相同。
我试图用一个测试用例重现这个问题,但我无法设法引发这样的多次刷新。在我必须调试整个 Hibernate 代码之前,我希望你们 Hibernate 专家能帮助我解决这个问题。
干杯,克里斯
【问题讨论】:
标签: hibernate interceptor