Всегда есть так много вопросов, связанных с проблемами с отдельными объектами!
Во-первых, они часто вызывают LazyInitializationException
в Hibernate.
Да, есть еще один провайдер персистентности, который не бросает исключений,
но я думаю, что у них есть некоторые проблемы с последовательностью.
Рассмотрим, что мы имеем A
и B
сущности,
(@ManyToOne
) от A
до B
, который должен быть непустым.
Мы начали нашу сессию, загрузили экземпляр A
и затем закрыли сессию.
После этого мы попытаемся получить ссылку на B
.
И предположим, что другая транзакция просто удалила как наши A
, так и B
экземпляры. Поэтому, когда мы запрашиваем из базы данных, мы не можем найти подходящий экземпляр B
и получить null
!
Таким образом, наш контракт нарушен. Некоторый код, который полагается на то, что
a.getB()
возвращает объект, который выдает NullPointerException
.
С постоянными сущностями это невозможно, потому что у нас есть все ленивые
загрузка в той же транзакции с получением самого объекта,
поэтому все операции являются атомарными (если у нас есть правильная изоляция транзакций, конечно).
Также есть проблемы, когда вы хотите хранить постоянные и отдельные объекты в одном Set
. В этом случае вы всегда должны переопределять equals
и hashCode
, что обычно выглядит неудобно, поскольку я не вижу действительно хорошего способа сделать это.
Чтобы вернуть удаленный объект обратно в EntityManager
, вы должны использовать merge
, который является глючным.
Итак, мой вопрос: существует ли разумный сценарий, в котором действительно нужны отдельные объекты? Кроме того, когда вам приходится смешивать отдельные и постоянные объекты
и объединить отдельные объекты в новый EntityManager
?