在同一会话中使用条件选择查询时,在一个方法中在hibernate会话中完成的更改是不可见的

时间:2016-07-08 20:22:03

标签: mysql hibernate session criteria

我有一个包含许多列的表A,包括列“c”。 在一个方法中,我将行“r1”的“c”值更新为“c1”,并且在后续方法之一(仍然在同一个线程中运行)中,我尝试读取值为“c”的所有行等于使用hibernate的标准来“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”行。两种方法都在同一个线程中运行并使用相同的hibernate会话。为什么getAllAsForGivenC无法在updateA()中看到更新的行?我做错了什么?

P.S:我在MySQL DB上运行它(如果重要的话)

提前致谢, Shobhana

1 个答案:

答案 0 :(得分:0)

在方法调用之间执行session.flush(),然后尝试。

e.g。

updateA(1l, 2l);

//do Flush
session.flush();

getAllAsForGivenC(2l);

<强> - 更新 -

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

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

除非显式flush(),否则在Session执行JDBC调用时只有无保证,只有它们执行的顺序。

在每次查询之前刷新都不会!请记住,Hibernate会话的目的是最小化对数据库的写入次数,因此如果它认为不需要,它将避免刷新到数据库。

如果框架作者选择将其命名为 FlushMode.SOMETIMES ,那将更直观。