【问题标题】:Native SQL select forces flushing in transactional method本机 SQL 选择强制在事务方法中刷新
【发布时间】:2020-04-03 19:34:50
【问题描述】:

我有一个插入对象的事务方法。调试器显示在eventsDAO.save(..) 上没有发生实际的插入,但只有一个序列提取。我第一次在调试器中看到insert into events_t .. 是在引用刚刚插入的事件时。

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = false)
public void insertEvent(..) {

   EventsT eventsT = new EventsT();
   // Fill it out...
   EventsT savedEventsT = eventsDAO.save(eventsT);  // No actual save happens here
   // .. Some other HQL fetches or statements ...

   // Actual Save(Insert) only happens after some actual reference to this EventsT (below)
   // This is also HQL
   SomeField someField = eventsDAO.findSomeAttrForEventId(savedEventsT.getId());
}

但我也看到,这仅在所有语句都是 HQL(非本地)时才成立。

只要我在对该表的任何实际引用之前放置一个 Native-SQL Select,即使它没有以任何方式接触该表,它也会强制立即刷新,我会看到在那个确切的时间点在控制台上声明insert into events_t ...

如果我没有以任何方式使用 Native SQL Select 触摸表 EventsT,为什么此时会发生刷新?

【问题讨论】:

    标签: spring hibernate spring-data


    【解决方案1】:

    根据休眠documentation

    6.1。自动冲洗

    默认情况下,Hibernate 使用自动刷新模式,在以下情况下触发刷新:

    • 在提交交易之前

    • 在执行与排队实体操作重叠的 JPQL/HQL 查询之前

    • 在执行任何未注册同步的本机 SQL 查询之前

    所以,这是预期的行为。另见this 部分。它展示了如何使用同步。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2016-01-11
      • 1970-01-01
      • 2011-02-17
      • 2011-07-05
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多