【问题标题】:Hibernate criteria.list() sets the session dirtyHibernate criteria.list() 设置会话脏
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2011-09-24
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多