0

我有一个带有 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 ?

4

1 回答 1

1

尝试明确指定 unitName:

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

(旁注 - 你确定你需要依赖范围内的 DAO 吗?它不应该是单例吗?)

于 2011-02-02T17:05:40.337 回答