Метод сохранения состояния JSF и ленивые отношения

У меня есть классы в моей модели предметной области с большим количеством ленивых отношений; Я использовал сохранение состояния на стороне сервера с помощью JSF, и это позволило мне инициализировать эти ленивые сопоставления по запросу на уровне представления.

Но переключаясь на сохранение состояния на стороне клиента, у меня есть исключение из EclipseLink, говорящее мне, что он не может сериализовать представление. Рассматриваемый EL использует цепочку методов для отображения имени пользователя (пользователь представляет собой ленивое отношение, как показано ниже):

<h:outputText value="#{labels['name']}: #{bean.project.manager.name}" />

Исходный код для уровня представления JSF содержит это повсюду. Предварительная инициализация этих отношений требует больших затрат, и, кроме того, некоторые части представления могут не отображаться сразу, так что... У вас есть предложения? Вы когда-нибудь сталкивались с этим при использовании EclipseLink?

Кстати, это JSF 2 с Glassfish v3.0.1. PrimeFaces в качестве библиотеки компонентов, EJB и CDI в качестве связующего.

Заранее спасибо!


person javabeats    schedule 25.10.2010    source источник


Ответы (1)


Как только вы сериализуете объект с LAZY отношением, вы больше не сможете создавать его экземпляры. Вам нужно либо избегать сериализации, либо убедиться, что нужные отношения созданы перед их сериализацией.

Вы можете создать экземпляр отношения, просто обратившись к нему, для ленивой коллекции просто отправьте size() в коллекцию. Вы также можете использовать LoadPolicy в EclipseLink >= 2.1, чтобы выбрать, какие отношения создавать в запросе. Вы также можете переопределить метод сериализации вашего объекта, чтобы сначала принудительно создать экземпляр для желаемых отношений.

Дело не в том, что с большинством других поставщиков JPA вы не сможете создать экземпляр отношения после завершения транзакции/закрытия EntityManager, поэтому даже состояние на стороне сервера не будет работать.

person James    schedule 10.11.2010