gpt4 book ai didi

mysql - 在一种方法中在 hibernate session 中完成的更改对于使用同一 session 中的条件的选择查询来说是不可见的

转载 作者:行者123 更新时间:2023-11-29 20:48:15 26 4
gpt4 key购买 nike

我有一个表 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 session 。为什么 getAllAsForGivenC 无法看到 updateA() 中更新的行?我做错了什么?

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

提前致谢,肖巴纳

最佳答案

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

例如

updateA(1l, 2l);

//do Flush
session.flush();

getAllAsForGivenC(2l);

--更新--

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

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

除非您显式地执行flush(),否则绝对无法保证 session 何时执行 JDBC 调用,只能保证它们的执行顺序。

刷新不会在每个查询之前发生!请记住,Hibernate session 的目的是最大限度地减少对数据库的写入次数,因此如果它认为不需要,它将避免刷新到数据库。

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

关于mysql - 在一种方法中在 hibernate session 中完成的更改对于使用同一 session 中的条件的选择查询来说是不可见的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com