【发布时间】:2016-05-25 23:19:26
【问题描述】:
我对条件 API 有以下查询:
1.
ICriteria criteria = _session.CreateCriteria<Country>();
criteria.Add(Restrictions.Like("Code", "%C%"));
IList<Country> countryList = criteria.List<Country>();
2.
ICriteria criteria = _session.CreateCriteria<Facility>();
criteria.Add(Restrictions.Like("Visible", true));
IList<Facility> facilityList = criteria.List<Facility>();
在第二次查询之后,我的会话变脏了,而在第一次查询之后却没有。我的Country 实体只有简单的属性,Facility 也有多对一和一对多。
你能告诉我为什么会话变脏了吗?
【问题讨论】:
-
“会话变脏”是什么意思?
-
_session.IsDirty() 返回 true
-
您是否在同一事务中做其他事情? AFAIK 本身的查询不会将会话设置为脏。当您在托管会话中修改对象时会发生这种情况,并且 Hibernate 将该对象标记为需要持久保存到数据库中,无论是在 TX 结束时,还是在
flush()调用上,以先发生者为准。发布更多代码。 -
我意识到实体的构造函数用0初始化了一个字段,但是DB中的值为null。加载此实体时,该字段会立即更新,因此会话会变脏。无论如何设置休眠日志级别来跟踪帮助我找到了问题。
-
来自forum.hibernate.org/viewtopic.php?f=1&t=986804,说“执行查询可能会导致刷新会话->因此所有脏对象都将持久/更新到数据库”
标签: hibernate criteria hibernate-criteria