У меня есть приложение 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?