@Транзакционные методы, вызываемые внутри TransactionTemplate

#spring #hibernate #spring-data-jpa #spring-transactions

#spring #переход в спящий режим #spring-data-jpa #весна-транзакции

Вопрос:

В моем приложении есть сложная задача, которая интенсивно использует TransactionTemplate. У меня проблема только тогда, когда я это делаю:

 transactionTemplate.execute(status -> {
  component1.method1();
  .....
  //COMMIT OF THE TRANSACTION
}
 

где component1 — это что-то вроде этого:

 @Component
public class Component1{
   public boolean method1(){
       component2.method2();
       ....
       ....
 

где component2 — это что-то вроде этого:

 @Transactional
public interface Component2 extends JpaRepository<Impostazione, Long>
    @Query(value = "FROM Settings WHERE key=?")
@Transactional(readOnly = true)
public Impostazione method2(String key);
 

Все работает нормально, но добавление этого в компонент, который сохраняется:

 @PreUpdate
@PrePersist
private void printLog(){
   log.debug("*******UPDATE/PERSIST**********");
 

Я вижу, что Hibernate (я его использую) обновляет / сохраняет объект ДО того, как я выйду из кода TransactionTemplate, то есть ДО того, как транзакция будет зафиксирована.

Теперь я совершенно уверен, что удаление аннотации @Trasactional из моего метода должно работать, но я не могу этого сделать, потому что я повторно использую сервисы, которые я использую также в других частях моего приложения. Я думаю, что неразумно копировать код и иметь сервис с @Transactional и сервис без него с той же реализацией.

Надеюсь на вразумительный ответ. Спасибо!

——РЕДАКТИРОВАТЬ ——— Наконец, также удаление @Transactional из Component2 проблема все еще сохраняется. Интересно…

Комментарии:

1. Действительно ли удаление @Transactional изменяет поведение?

2. Предперсистский не означает предварительный. Спящий режим не всегда ожидает завершения транзакции, чтобы сохранить ее.

3. @JBNizet, так нормально ли, что он вводится в метод несколько раз перед фиксацией? Нет никакой гарантии, что метод вызывается только один раз после обновления / фиксации?

4. Да. Предварительно обработанные аннотированные методы вызываются до того, как объект сохраняется в базе данных. Не раньше, чем транзакция будет зафиксирована.

5. По вашему мнению, есть разумный способ перехватить фиксацию транзакции? Моя цель — внести некоторые изменения в компонент до того, как он будет зафиксирован. Но если @preUpdate вызывает эти методы несколько раз, в моем случае это довольно дорого. Спасибо