Почему мои сущности становятся неуправляемыми после двух звонков? - PullRequest
2 голосов
/ 21 ноября 2010

В приложении, генерируемом seam-gen, у меня есть пользовательский объект, который проверяется во время аутентификации.Я проверяю в аутентификаторе, доступна ли сущность, если да, я загружаю сущность в методе UserHome.find().

Если он недоступен, я хочу заставить пользователя зарегистрироваться.Это работает до сих пор.

Но при последующих вызовах, если мне нужно снова использовать пользовательский объект.Сущность становится «неуправляемой».Я пытался вставить его в Scope.Session, но это тоже не помогло.

Каждый вызов EntityHome.isManaged() вызывает исключение, так как EntityManager уже закрыт.

  • Вопрос в том, кто закрывает entityManager и почему?.

  • Существует ли способ предотвратить закрытие сущности EntityManager, кроме использования:

    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    EntityManager entityManager;
    

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

EntityManager ограничен разговором. Если вы не начинаете разговор (с @Begin) в запросе, Seam закрывает entityManager после запроса. Добавление объекта в область сеанса не помогает, потому что entityManager все равно закрывается.

Чтобы не допустить, чтобы Seam закрыл entityManager, вы либо используете расширенный контекст персистентности, о котором упоминали сами, либо работаете с компонентом в области диалога. В зависимости от контекста вашего компонента и последующих вызовов, соответственно, использование области диалога может быть неуместным.

Если вы выводите объект в область действия сеанса. Вы можете повторно присоединить его к новому entityManager при последующих вызовах, используя entityManager.find(.) или entityManager.getReference(.).

1 голос
/ 22 ноября 2010

Что сказал @kraftan, и я хочу добавить следующее:

Использовать контекст персистентности, управляемой швом, либо путем инъекции

@In EntityManager entityManager; 

если вы в компонентах.xml определили

<persistence:managed-persistence-context
    name="entityManager" auto-create="true" persistence-unit-jndi-name="@puJndiName@" />

Или, если вы находитесь внутри платформы приложения Seam, вы можете просто сказать getEntityManger() и вы можете работать с управляемым объектом управления шовом

...