Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate criteria.list()将会话设置为脏_Hibernate_Criteria_Hibernate Criteria - Fatal编程技术网

Hibernate criteria.list()将会话设置为脏

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(); 在第二次查询之后,我的会话变脏,而在第一次查询之后,它不会

我对criteria API有以下查询:

一,

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>();