select 在同一会话中使用条件的查询不可见在休眠会话中以一种方法完成的更改

Changes done in a hibernate session in one method are not visible to select query using criteria within the same session

我有一个 table A,其中有很多列,其中包括一列 "c"。 在一种方法中,我将行 "r1" 的 "c" 的值更新为 "c1" 并在后续方法之一(仍然 运行ning 在同一线程中),我尝试使用 hibernate 的标准读取所有 "c" 等于 "c1" 的行。

代码片段如下所示:

@Transactional
public void updateA(long id, long c1)
{
    Session currentSession = sessionFactory.getCurrentSession();
    A a1 = (A) currentSession.get(A.class.getName(), id);
    a1.setC(c1);
    currentSession.saveOrUpdate(a1);
}

@Transactional
public void getAllAsForGivenC(long c1)
{
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(A.class.getName());
    Criterion cValue= Restrictions.eq("c", "c1");
    criteria.add(cValue);
    return criteria.list();
}

但是执行getAllAsForGivenC方法时,"r1"行没有返回。两种方法 运行 在同一线程中使用相同的休眠会话。为什么 getAllAsForGivenC 看不到 updateA() 中更新的行?我做错了什么?

P.S:我 运行 这个在 MySQL 数据库上(如果重要的话)

提前致谢, 肖巴纳

在你的方法调用之间做 session.flush() 然后尝试。

例如

updateA(1l, 2l);

//do Flush
session.flush();

getAllAsForGivenC(2l);

--更新--

如文档所述,进程刷新默认发生在以下几点:

  • 在某些查询执行之前
  • 来自 org.hibernate.Transaction.commit()
  • 来自 Session.flush()

除非您明确地使用 flush(),否则绝对无法保证 会话何时执行 JDBC 调用,只能保证它们的执行顺序。

刷新不会在每次查询之前发生!请记住,Hibernate 会话的目的是尽量减少写入数据库的次数,因此如果它认为不需要,它会避免刷新到数据库。

如果框架作者选择命名它会更直观 FlushMode.SOMETIMES.