Я видел много комментариев в статьях с переполнением стека. Я нашел некоторые вещи о @Transactional с @Service или с @Controller
"Как правило, на сервисный уровень следует поместить транзакцию".
"Нормальным случаем будет аннотация на уровне уровня обслуживания"
"Думайте, что транзакции принадлежат слою службы. Это тот, который знает об единицах работы и случаях использования. Это правильный ответ, если у вас несколько DAO, введенных в Службу, которые должны работать вместе в одной транзакции". [Источник]
Недостаток использования @transactional с уровнем @service
Если у меня было 2 метода, например saveUser() и saveEmail() (потому что я хранил электронные письма в базе данных для их отправки позже - как очередь), я бы создал в своей службе метод saveUserAndSendEmail (Пользователь пользователя), который бы быть транзакционным. [Источник]
Это означает, что я создаю много методов на уровне службы вместо одного Сохранить общий метод, как следует
public <T> long save(T entity) throws DataAccessException {
Session session = sessionFactory.getCurrentSession();
long getGenVal=(Long) session.save(entity);
return getGenVal;
}
В соответствии с приведенным выше решением это означает, что у нас есть много методов, таких как LOL..
public <T> long saveAccount(T entity)....
public <T> long saveWithAuditLog(T entity, K entity1)....
public <T> long saveWithAuditLogAndEntries(T entity, K entity, M entity)....
ДОПОЛНИТЬ эту ситуацию
Я использую @Transactional в @Controller и просто создаю общий метод сохранения и сохраняю все сущности/модель с помощью этого простого метода сохранения. и если какой-либо метод не сможет успешно сохранить все транзакции в откате контроллера.
Другая ситуация, которая гарантирует, что @Transactional следует использовать с @Controller
В @Controller:
pt.save(entity1);
pt.save(entity2);
int a = 2/0;
pt.save(entity3);
В случае, если @Transactional on Service, первый 2 объекта успешно сохранен, но третий, не откат всей транзакции
В случае, если @Transactional на @Controller имеет все откат транзакции как исключение
почему переполнение стека спрашивается: "Не делайте транзакций в своем контроллере. Поместите их в классы уровня обслуживания"? [источник]