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

时间:2012-11-15 08:43:48

标签: hibernate criteria hibernate-criteria

我使用条件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也有多对一和一对多。

你能告诉我为什么会话变脏了吗?

1 个答案:

答案 0 :(得分:0)

假设您的第二个查询返回一个Facility对象f1,其EntityKeyk1。它变脏的原因是:在第二次查询之前,同一Session已经拥有Facility对象f2,其EntityKeyk1相同!虽然f1f2之间存在一些不同的属性。在第二次查询期间,执行查询使会话执行脏检查,因此会话被视为&#34;脏&#34;。

如何调试?您可以输出当前会话在 第二次查询之前持有 的所有对象(类似Set<EntityKey> set = session.getStatistics().getEntityKeys();,参考Hibernate session.contains( Class clazz, Serializable id ),@ TheReincarnator的答案),我认为你应该找到至少一个Facility。然后你可以调试Facility是否与第二个查询得到的相同(它应该是不同的!)。