Мне нужно реализовать GetOrCreate (я его называю sureExists) сущности в веб-приложении, управляемом spring-jpa (hibernate).
У меня есть многоуровневое приложение (WS / Services / DAL / Datastore), и я хочу реализовать эту функциональность на уровне обслуживания (с пружинным управлением).
Основная идея:
- Find-объект
- Если найден, верните его.
- В противном случае сохраните сущность.
- Если все в порядке, верните его.
- Если произошло уникальное нарушение ограничения, попробуйте снова найти объект и вернуть его.
Проблема возникает из-за того, что после создания исключения сеанс гибернации должен быть закрыт и вновь открыт (из документации сеанса ), что делает шаг 5 недействительным, но я все еще хочу инкапсулировать эту логику в уровень обслуживания (и не иметь его в DAL или WS).
Мне бы очень хотелось услышать предложения о том, как это можно решить, у меня есть идея, но я хотел бы услышать некоторые комментарии, прежде чем публиковать их, чтобы не наклонять ответы на них.
Заранее спасибо
Обновление
Решение, которое я имею в виду, заключается в следующем:
Реорганизовать стадию 3 в сервис с областью действия пакета, который имеет единственный метод sureExists (с обобщениями), который принимает Dao этого типа и сущности и имеет распространение REQUIRES_NEW
. Этот метод попытается сохранить, и, если произойдет сбой, он, конечно, выдаст исключение, которое будет перехвачено в исходном сервисе, и попытается сохранить его, если это исключение было сгенерировано.
Я хотел бы получить отзыв о том, как это можно реализовать в противном случае.
Если через пару дней никто не предложит иного, я опубликую это как ответ с примером кода и приму его.