tgoop.com/BookJava/3859
Last Update:
🧠 Осторожно с @Transactional на private-методах!
Очень частый анти-паттерн, который легко упустить 👇@Service
public class UserService {
@Transactional
private void saveUser(User user) {
userRepository.save(user);
}
public void create() {
saveUser(new User());
}
}
Кажется, всё ок. Но ❌ транзакция НЕ работает.
📌 Почему?
Spring AOP использует прокси, а прокси не “видит” вызовы private-методов внутри класса. Такие вызовы происходят напрямую, мимо прокси-обёртки — и аннотация @Transactional просто игнорируется.
💡 Решение:
1. Сделай метод public и вызывай его извне (или из другого бина).
2. Или выдели этот метод в отдельный бин-сервис.
Пример:@Service
public class UserTransactionalHelper {
@Transactional
public void saveUser(User user) {
userRepository.save(user);
}
}
И в UserService:public void create() {
helper.saveUser(new User());
}
⚠️ Так же не работают protected, private, final, static, и @PostConstruct-методы.
Нужно помнить: Spring AOP = прокси, а значит, работают только публичные методы, вызываемые ИЗВНЕ.
👉@BookJava
BY Библиотека Java разработчика

Share with your friend now:
tgoop.com/BookJava/3859
