1

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

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

4

1 回答 1

0

假设您的第二个查询返回一个Facility对象f1,它的EntityKeyk1。它变脏的原因是:在第二次查询之前,同样Session已经持有一个Facility对象f2,并且它的EntityKeyk1f1虽然和之间有一些属性不同f2。在第二次查询期间,执行查询使 Session 进行脏检查,因此 Session 被视为“脏”。

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

于 2016-05-25T15:19:26.493 回答