我有一个带有 EJB 模块的 EAR 应用程序,它包含一个持久性单元和许多 EJB(作为服务和 DAO 层)。
@Stateless
public class BranchDAO {
@PersistenceContext
private EntityManager entityManager;
}
但不推荐将 DAO 作为无状态 bean。所以我使用 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:无法为 unitName null 检索 EntityManagerFactory
此错误仅发生在 Glassfish 3 中,但不会发生在 JBoss AS 6 中。使用 JBoss AS 6 我可以在启动时看到 Hibernate 日志(但在 Glassfish 中看不到它们)。
作为临时解决方案,我创建了一个具有以下内容的无状态 bean。这不是一个漂亮的解决方案,但在 Glassfish 中运行良好。
@Stateless
@Startup
public class AutoStartEntityManager {
@PersistenceContext
private EntityManager entityManager;
}
@Stateless
那么,当我不在DAO 中使用时,如何强制 Glassfish 调出 EntityManager ?