2011-02-02 73 views
0

我有一個包含一個持久性單元和許多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?

+0

有什麼不對無狀態的DAO? – axtavt 2011-02-02 17:22:21

+0

在這裏看到Pascal的答案:http://stackoverflow.com/questions/3223112/javaee6-dao-should-it-be-stateless-or-applicationscoped/3224607#3224607 – 2011-02-02 18:10:20

回答

1

嘗試顯式指定的unitName:

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

(阿里納斯 - 你確定你需要在相關範圍內的DAO難道不應該是單身?)

相關問題