CDI (сварка) + DeltaSpike + Conversation

В настоящее время я пытаюсь заставить CDI (точнее, Weld) работать с JSF 2 и вести долгий разговор. Я начинаю разговор в @ConversationScoped моего поддерживающего компонента. Я также создаю менеджер сущностей @ConversationScoped. К сожалению, объект, который я редактирую в своем вспомогательном компоненте, всегда получает LazyInitializationException, когда JSF пытается записать сопоставленное поле @ManyToMany. Кажется, что сущность отсоединяется от менеджера сущностей. В моем EntityManagerProducer (см. ниже) метод createEntityManager() не вызывается до того, как будет выброшено исключение LazyInitializationException, поэтому я предполагаю, что entitymanager на самом деле находится в области действия сеанса. Но, насколько я понимаю, мой код не генерирует расширенный контекст сохранения (поскольку я не мог понять, как это сделать программно).

Насколько я знаю, DeltaSpike еще не предлагает ничего для работы с длительными диалогами в JSF. Может ли кто-нибудь предложить метод реализации длительных разговоров с CDI с использованием Weld + DeltaSpike (желательно на Tomcat с сервлетом для сварки)?

@ApplicationScoped
public class EntityManagerProducer {
    @Inject
    @PersistenceUnitName("myUnit")
    private EntityManagerFactory emf;

    @Produces
    @ConversationScoped
    public EntityManager createEntityManager() {
        return emf.createEntityManager();
    }

    public void closeEm(@Disposes EntityManager em) {
        em.close();
    }
}

person egore911    schedule 04.12.2013    source источник


Ответы (2)


Исключение ленивой инициализации на самом деле не происходит из контекстов расширенного сохранения или CDI или DeltaSpike. Это просто такое же поведение, как описано здесь: selectManyCheckbox LazyInitializationException при проверке процесса

JSF 2 клонирует PersistentBag моего объекта, заставляя его отсоединяться. Я также работал, разбрызгивая много

<f:attribute name="collectionType" value="java.util.ArrayList" />

во всем моем коде JSF.

person egore911    schedule 04.12.2013

Наличие EntityManager в области диалога — это только одна сторона уравнения, в какой области находятся ваши сущности?

Чтобы избежать отсоединения сущностей, они также должны находиться в области диалога.

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

person ShayM    schedule 31.03.2014