2010-07-09 155 views
0

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

我该如何避免这种行为?

+0

尝试定义“一些情况”。尝试在独立测试用例中查明问题。另外,有没有机会使用flushmode.auto *和*手动刷新? – 2010-07-09 23:02:23

+0

我没有设置FlushMode,我认为设置为默认行为,但是我已经看到了这个;我有一个名为“AddressCountryMode”的字段在数据库中为null,当onFlushDirty被触发时,previousState为“null”,currentState为0,这是原因吗? – 2010-07-12 22:53:09

回答

0

我想我解决了我的问题,但我不知道为什么会发生这种情况。

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

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

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

0

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

我也遇到了这样的情况:在提交之前,Hibernate会刷新会话数次,这会导致onFlushDirty中的任何逻辑运行的次数比我想要的还要多。发生这种情况的原因是,当会话设置为FlushMode.AUTO时,会话在检索之前被刷新,以包含最近未提交的更改。这是by design,所以我在变更审计后立即开始提交。

相关问题