приложение spring mvc в котором используется Hibernate. Приложение представляет собой обычный CRUD (REST API).
Соответственно в рамках приложения сформирован сервисный слой для каждой сущности, который имеет методы: create(), update(), delete(), get().
Получается, что в контроллере тупо идет вызов сервиса, а вся логика идет непосредственно в сервисе.
Собственно сами вопросы:
1. На всех методах висят аннотации Transactional - это корректное решение? (с различными настройками, например readOnly)
2. Метод create() каждого сервиса сейчас возвращает Long идентификатор созданной сущности. Не правильнее ли было возвращать саму Entity сформированную? Поясню почему пугает - есть переживание за счет того, что после завершение транзакции в методе сервиса можно получить какие-либо проблемы при дальнейшем использовании entity т. к. может быть другая сессия Hibernate (опасения скорее всего из за недостатка понимания теории, в каокой момент эта ошибка может произойти). Плюсом еще если вдруг будет изменение ключа в сущности надо менять возвращаемое значение во всех сервисах, а с сущностью такой проблемы не будет
3. Например вызываем метод create() сервиса - должен ли при этом сам сервис персистить сущность в базу данных? Поясню к чему вопрос: другие сервисы могут также вызывать этот сервис и проставлять внешние ключи в своих сущностях. В самих сущностях прописаны Cascade и вроде бы логичнее вернуть просто заполненную entity, а Hibernate потом сам выполнить persist при сохранении основной сущности. Вот и вопрос из за этого появился.
1) ознакомься с данной аннотацией 2) вопрос, что тебе нужно вернуть? Описание сущности или просто её id? 3) А что он должен делать?
Обсуждают сегодня