Мы начинаем разработку нового веб-приложения, используя JSF (MyFaces на TomEE) и JPA (Eclipselink).Чтобы ускорить разработку, мы НЕ планируем разрабатывать слой DTO, в основном потому, что он нам не нужен.Следуя советам экспертов JSF и Java EE, таким как Bauke Scholtz Как использовать DTO в JSF + Spring + Hibernate и Adam Bien Насколько злые объекты Data Transfer , мы будем использовать объекты JPA напрямуюв уровне представления.Тем не менее, это приложение должно работать в кластере серверов с липким сеансом.Когда сервер отключается для обслуживания или исключается из кластера для развертывания приложений, пользовательские сеансы этого сервера должны обслуживаться другими серверами без потери сеанса.Проблема, с которой мы сталкиваемся, заключается в том, что сущности JPA, которые сохраняются в сеансе (например, в компоненте @ViewScoped), не «полностью» реплицируются на других серверах.Фактически атрибуты коллекции сущностей JPA, которые используют отложенную загрузку, не могут использоваться на других серверах.При доступе к коллекции attibute (@OneToMany, использующей отложенную загрузку) на сервере, имеющем реплику сеанса, возникает исключение
org.eclipse.persistence.exceptions.ValidationException
Exception Description: An attempt was made to traverse a relationship
using indirection that had a null Session.
This often occurs when an entity with an uninstantiated LAZY
relationship is serialized and that relationship is traversed
after serialization.
To avoid this issue, instantiate the LAZY relationship
prior to serialization
.
Я знаю, что EntityManager не сериализуем и сущности JPA полностью отключаются при сериализации во время миграции сеанса, см. Блог Струберга .Таким образом, вопрос в том, существует ли способ поддерживать сущности JPA согласованным образом в кластере серверов, не используя загрузку EAGER?