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