Hibernate criteria.list()将会话设置为脏
我对criteria API有以下查询: 一,Hibernate criteria.list()将会话设置为脏,hibernate,criteria,hibernate-criteria,Hibernate,Criteria,Hibernate Criteria,我对criteria API有以下查询: 一, ICriteria标准=_session.CreateCriteria(); 添加(限制,如(“代码”、“%C%”); IList countryList=criteria.List(); 二, ICriteria标准=_session.CreateCriteria(); 标准。添加(限制。如(“可见”,真实)); IList facilityList=criteria.List(); 在第二次查询之后,我的会话变脏,而在第一次查询之后,它不会
ICriteria标准=_session.CreateCriteria();
添加(限制,如(“代码”、“%C%”);
IList countryList=criteria.List();
二,
ICriteria标准=_session.CreateCriteria();
标准。添加(限制。如(“可见”,真实));
IList facilityList=criteria.List();
在第二次查询之后,我的会话变脏,而在第一次查询之后,它不会变脏。我的国家/地区
实体只有简单的属性,设施
也有多对一和一对多
您能告诉我会话变脏的原因吗?假设您的第二个查询返回一个
Facility
对象f1
,它是k1
。它变脏的原因是:在第二次查询之前,相同的会话
已经持有一个设施
对象f2
,并且它与k1
相同!而f1
和f2
之间有一些属性不同。在第二次查询期间,执行查询使会话执行脏检查,因此会话被视为“脏”
如何调试这个?您可以在第二次查询之前输出当前会话持有的所有对象(类似于
Set Set=Session.getStatistics().getEntityKeys();
,请参阅@TheRelationator的答案),我认为您应该至少找到一个工具。然后,您可以调试工具
是否与第二个查询获取的相同(应该不同!)。您对“会话变脏”的理解是什么?\u session.IsDirty()返回true您在同一事务中做了其他事情吗?查询本身不会将会话设置为dirty。当您在托管会话中修改一个对象,并且Hibernate将该对象标记为需要持久化到DB时,无论是在TX结束时,还是在flush()
调用中,以先发生的为准,都会发生这种情况。发布更多代码。我意识到实体的构造函数使用0初始化字段,但DB中的值为null。加载此实体时,字段立即更新,因此会话变脏。无论如何,将hibernate loglevel设置为trace有助于我找到问题。从,说“执行查询可能会导致刷新会话->因此所有脏对象都将持久化/更新到数据库”
ICriteria criteria = _session.CreateCriteria<Country>();
criteria.Add(Restrictions.Like("Code", "%C%"));
IList<Country> countryList = criteria.List<Country>();
ICriteria criteria = _session.CreateCriteria<Facility>();
criteria.Add(Restrictions.Like("Visible", true));
IList<Facility> facilityList = criteria.List<Facility>();