Использование сущностей в JSF - PullRequest
0 голосов
/ 28 марта 2012

Я пишу веб-приложение (Tomcat 7), поэтому нет JTA и хочу отобразить список проектов, включая задачи, связанные с каждым проектом на странице JSF.

Есть 2 объекта - Project, который содержитСборник задач.Из моего управляемого компонента я вызываю удобный метод для извлечения всех активных проектов, затем перебираю (ui: repeat) над этой коллекцией проектов и хочу отобразить задачи для проекта.Когда я пытаюсь сделать это, я получаю Исключение Постоянства, так как Контекст Постоянства больше не находится в области действия.

Без создания вспомогательных компонентов Проекта и Задачи и без использования Расширенного контекста, какие другие опции у меня есть.

Ответы [ 3 ]

1 голос
/ 29 марта 2012

После некоторых размышлений и исследований я вернулся, чтобы должным образом описать ситуацию, в которой я нахожусь, а затем также предоставить способ решения проблемы.

Что выясняется, так это то, что сущность Проекта имеетОтношения задач указаны как Lazy Loaded.JPA использует прокси-объект, который ожидает запроса к коллекции, прежде чем запрашивать данные для извлечения.Это становится проблемой, поскольку мы пытаемся получить доступ к информации после того, как постоянный контекст отключил объекты.

Разрешение:

Запуск отложенной загрузки - Пока постоянный контекст все еще находится в области действия, вызовите метод получения коллекции и любые другие методы, для которых вы хотите получить данные, это инициирует выборку данных и добавление сущности.

Сделайте тип выборкиEager - Просмотрите причины использования ленивой загрузки и измените тип выборки на eager."FetchType.EAGER"

Fetch Joins - Добавление ассоциации как части JP QL для извлечения вместе с запросом.Это оптимизирует запрос и ассоциацию для загрузки за один вызов, при этом возвращая только один объект.«ВЫБРАТЬ p ИЗ ПРОЕКТА p СЛЕДУЮЩАЯ ПОДПИСКА p.tasks»

Надеюсь, что это поможет следующему человеку найти решение своей проблемы.

0 голосов
/ 28 марта 2012

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

Редактировать: JPA 2.0 спецификация пишет в разделе 4.4.5.3:

FETCH JOIN включает выборку ассоциации или коллекции элементов как побочный эффект выполнения запроса.

Синтаксис для соединения извлечения:

fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression

Ассоциация, на которую ссылается правая часть предложения FETCH JOIN, должна быть ассоциацией или коллекцией элементов, на которую ссылается сущность или встраиваемость, возвращаемая в результате запроса.

Не разрешается указывать идентификационную переменную для объектов, на которые ссылается правая часть предложения FETCH JOIN, и, следовательно, ссылки на неявно выбранные объекты или элементы не могут появляться в других местах запроса.

Следующий запрос возвращает набор отделов. Как побочный эффект, связанные сотрудники для этих отделов также извлекаются, даже если они не являются частью явного результата запроса. Инициализация постоянных полей состояния или отношений или свойств объектов, которые извлекаются в результате соединения выборки, определяется метаданными для этого класса - в этом примере сущности Employee класс.

SELECT d 
FROM Department d LEFT JOIN FETCH d.employees
WHERE d.deptno = 1

Соединение извлечения имеет ту же семантику соединения, что и соответствующее внутреннее или внешнее соединение, за исключением того, что связанные объекты, указанные в правой части операции соединения, не возвращаются в результате запроса или не упоминаются в запросе иным образом. Следовательно, например, если в отделе 1 работает пять сотрудников, приведенный выше запрос возвращает пять ссылок на объект отдела 1.

Конструкция FETCH JOIN не должна использоваться в предложении FROM подзапроса.

0 голосов
/ 28 марта 2012

Вручную откройте EntityManager (используя фабрику) и запустите транзакцию, затем зафиксируйте ее и закройте менеджер сущностей.

Но это не очень хороший вариант - взгляните на что-то вроде CDI, Seamили Spring для управления транзакциями и сессиями для вас (если вы не хотите использовать EJB3)

...