我有一个包含许多列的表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
答案 0 :(得分:0)
在方法调用之间执行session.flush()
,然后尝试。
e.g。
updateA(1l, 2l);
//do Flush
session.flush();
getAllAsForGivenC(2l);
<强> - 更新 - 强>
正如文档所述,默认情况下,进程刷新发生在以下几点:
除非显式flush(),否则在Session执行JDBC调用时只有无保证,只有它们执行的顺序。
在每次查询之前刷新都不会!请记住,Hibernate会话的目的是最小化对数据库的写入次数,因此如果它认为不需要,它将避免刷新到数据库。
如果框架作者选择将其命名为 FlushMode.SOMETIMES ,那将更直观。