【问题标题】:Hibernate Session not getting flushed before native sql queryHibernate Session 在本机 sql 查询之前没有被刷新
【发布时间】:2019-04-16 09:04:50
【问题描述】:

我最近遇到了一个问题,即在执行本机 SQL 查询之前没有刷新休眠会话。创建会话的刷新模式是AUTO。对于实体A,代码是这样的

A a=aDao.getById(session,id);
  a.setB(3);
  ...
   String query = "select count(*) as total from A a where a.b=3";
   session.createSQLQuery(query)
             .addScalar("total", StandardBasicTypes.).uniqueResult();

问题是我在count(*) 查询中得到了错误的结果,因为在执行查询之前会话没有被刷新。如果我这样做了

session.flush();

count(*) 查询之前,它工作得很好。这与我从https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#flushing-auto 中读到的内容相反,其中指出

会话 API 将在执行时自动触发刷新 本机查询。

我可能会错过什么?

【问题讨论】:

标签: java hibernate


【解决方案1】:

实际上根据provided documentation 它可以按预期工作。有两个带有Session 的示例。第一个是示例 359。使用 Session 自动刷新本机 SQL 它有两个断言。请注意,第二个断言将 zero 与预期值进行比较。第二个例子是Example 360​​。在本机 SQL 上使用会话同步自动刷新,其中第二个断言的预期值是 one。因此,要实现您的预​​期行为,您必须启用如图所示的同步

【讨论】:

  • 是的,没错!错过了,不过是不是完全违背了上面例359写的语句,“执行原生查询时,Session API会自动触发flush”
  • 我猜这只是印刷错误或类似的东西。在文档的先前版本中,有一个直接注释:执行本机查询时,会话 API 不会触发自动刷新 Here it is
  • 其实不是印刷错误,Here is 是一个解释
猜你喜欢
  • 2017-05-19
  • 2018-06-21
  • 2017-04-14
  • 1970-01-01
  • 2019-11-10
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多