Glassfish не вызывает EntityManager, если DAO не является лицом без гражданства - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть приложение EAR с модулем EJB, которое содержит одну единицу персистентности и много EJB (как уровень обслуживания и уровень DAO).

@Stateless
public class BranchDAO {
    @PersistenceContext
    private EntityManager entityManager;
}

Но DAO в качестве бобов без состояния не рекомендуется. Поэтому я создаю эту аннотацию, используя CDI:

@Dependent
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DAO {
}

После того, как мой DAO изменен на неиспользуемый @Stateless:

@DAO
public class BranchDAO {
    @PersistenceContext
    private EntityManager entityManager;
}

Но Glassfish не вызывает менеджера сущностей при запуске приложения. И когда я звоню в DAO, менеджер организации находится в нелегальном состоянии.

java.lang.IllegalStateException: невозможно получить EntityManagerFactory для unitName null

Эта ошибка возникает только в Glassfish 3, но не в JBoss AS 6. Используя JBoss AS 6, я вижу журналы Hibernate при запуске (но я не вижу их в Glassfish).

В качестве временного решения я создал bean-компонент без состояния с содержимым ниже. Это не красивое решение, но отлично работает в Glassfish.

@Stateless
@Startup
public class AutoStartEntityManager {

    @PersistenceContext
    private EntityManager entityManager;

}

Итак, как я могу заставить Glassfish вызвать EntityManager, когда я не использую @Stateless в моем DAO?

1 Ответ

1 голос
/ 02 февраля 2011

Попробуйте явно указать unitName:

@PersistenceContext(unitName="yourJPAUnitName")
private EntityManager manager;

(sidenote - вы уверены, что вам нужен DAO в зависимой области? Разве это не должно быть singleton?)

...