我有一個包含一個持久性單元和許多EJB(作爲服務和DAO層)的EJB模塊的EAR應用程序。如果DAO不是無狀態的,Glassfish不會啓動EntityManager
@Stateless
public class BranchDAO {
@PersistenceContext
private EntityManager entityManager;
}
但是不建議將DAO作爲無狀態bean。所以,我創建一個使用CDI這個註解:
@Dependent
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DAO {
}
吾道後改爲不使用@Stateless
:
@DAO
public class BranchDAO {
@PersistenceContext
private EntityManager entityManager;
}
但Glassfish的不彈出實體管理器應用程序啓動時。當我打電話給DAO時,實體經理處於非法狀態。
java.lang.IllegalStateException:無法檢索EntityManagerFactory的爲空的unitName
此錯誤僅發生在Glassfish的3,但不是在JBoss AS中6.使用JBoss AS 6我可以看到Hibernate的日誌在啓動(但我沒有看到他們與Glassfish)。
作爲一個臨時解決方案,我創建了一個無狀態bean,其內容如下。這不是漂亮的解決方案,但在Glassfish中運行良好。
@Stateless
@Startup
public class AutoStartEntityManager {
@PersistenceContext
private EntityManager entityManager;
}
那麼,如何我當我不會用我的DAO @Stateless
可以強制Glassfish的,彈出的EntityManager?
有什麼不對無狀態的DAO? – axtavt 2011-02-02 17:22:21
在這裏看到Pascal的答案:http://stackoverflow.com/questions/3223112/javaee6-dao-should-it-be-stateless-or-applicationscoped/3224607#3224607 – 2011-02-02 18:10:20