Собственный SQL выбор силы сброса в транзакционном методе - PullRequest
1 голос
/ 03 апреля 2020

У меня есть транзакционный метод, где объекты вставляются. Отладчик показывает, что при 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).

Как только я помещаю Native- SQL Выберите где-нибудь перед любой реальной ссылкой на эту таблицу, , даже если она никак не касается таблицы , она вызывает немедленный грипп sh, и в этой точке я вижу на консоли утверждение insert into events_t ....

Если я не прикасаюсь к столу EventsT с помощью моего родного SQL Выберите в любом случае, почему в этот момент происходит промывка?

1 Ответ

2 голосов
/ 04 апреля 2020

Согласно документации на спящий режим :

6.1. AUTO flu sh

По умолчанию Hibernate использует режим AUTO flu sh, который вызывает грипп sh в следующих случаях:

  • до совершения транзакции

  • до выполнения запроса JPQL / HQL, который перекрывается с действиями объекта в очереди

  • перед выполнением любого Собственный SQL запрос, который не имеет зарегистрированной синхронизации

Итак, это ожидаемое поведение. Смотрите также этот раздел. Он показывает, как вы можете использовать синхронизацию.

...