#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 вызывает эти методы несколько раз, в моем случае это довольно дорого. Спасибо