为什么Hibernate触发onFlushDirty两次?

时间:2010-07-09 18:39:19

标签: castle-activerecord

最近我一直在使用Castle ActiveRecord框架,它一直运行良好,直到我发现一些奇怪的行为:onFlushDirty在某些情况下被触发两次。当我进行简单查询时甚至会触发它。我真的很困惑,因为我正在尝试在onFlushDirty中创建审计数据,当我读取数据时,它被触发,导致它保存相同的数据。

我该如何避免这种行为?

2 个答案:

答案 0 :(得分:0)

我想我解决了我的问题,但我不知道为什么会这样。

首先,我在数据库中拥有的数据在某些日期字段和整数字段中具有空值(数据来自Btrieve的迁移)。

当我在datagrid中加载数据时触发onFlushDirty事件,当我调试并观察数据时,我看到在具有null值的日期字段上,它有一个带有null的currentState和带有'0001-01-01 00的currentState: 00:00' 。我在数据库中更改了空值,在日期字段的情况下为'0001-01-01 00:00:00',对于整数字段为零,并且当我在数据网格上加载数据时,onFlushDirty事件从未再次触发。

但问题仍然存在。为什么会发生这种情况或者这种行为是否正确?

答案 1 :(得分:0)

我的猜测是你已经告诉Hibernate(在该表的映射或实体类的注释中)日期字段不应该为空,所以Hibernate为你设置它,但是因为这与值不同它从数据库中检索出来,标记为脏。

我还遇到过Hibernate在提交之前多次刷新Session的情况,这会导致onFlushDirty中的任何逻辑运行的次数超过我想要的次数。发生这种情况是因为当会话设置为FlushMode.AUTO时,会在检索之前刷新会话,以包括最近未提交的更改。这是by design,因此我在进行审核后立即开始提交。