2012-12-11 78 views
4

使用Glassfish 3.1.2取消部署和部署WebArchive(.war)時,我產生了奇怪的效果。重新部署之後JPA Entitiy中的ClassCastException(Glassfish 3.1.2)

$ asadmin undeploy myWebApp; asadmin deploy target/myWebApp.war 

它通常部署,但是當我通過實體管理器獲取實體bean,它拋出一個異常: [#|2012-12-11T15:26:09.772+0100|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=119;_ThreadName=Thread-2;|java.lang.ClassCastException: org.YourEntity cannot be cast to org.YourEntity

唯一的例外是在q.getSingleResult拋出()調用。

@PersistenceContext(unitName = "org.my-PU") 
    private EntityManager em = Persistence.createEntityManagerFactory("org.my-PU").createEntityManager(); 
    ... 
    public YourEntity findYourEntity() throws Exception { 
     TypedQuery<YourEntity> q = em.createQuery("select ye from YourEntity ye", 
       YourEntity.class); 
     return q.getSingleResult(); 
    } 

我使用以下JPA相關的依賴項目:

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>javax.persistence</artifactId> 
    <version>2.0.0</version> 
</dependency> 

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>eclipselink</artifactId> 
    <version>2.0.2</version> 
</dependency> 

<dependency> 
    <groupId>com.oracle</groupId> 
    <artifactId>ojdbc6</artifactId> 
    <version>11.1.0.7.0</version> 
</dependency> 

當我重新啓動了GlassFish,不會出現異常了。使用類似設置取消部署/部署.ear時,我從來沒有看到過這個問題。有沒有人看到錯誤並知道如何克服它?這不是一個大問題,但煩人。

回答

8

綁定到類加載器的資源是靜態保存的,直到EntityManagerFactories關閉。這些都是應用程序管理的,因此您必須在關閉時手動調用關閉工廠的關閉,或者在不再需要時取消部署事件 - 垃圾回收也可以清理它們,但在應用程序重新部署並再次訪問它們之前,不會發生這種情況不同的類加載器,導致你看到的異常。

抓住工廠並在不再需要時關閉它,或者使用注射並讓容器管理它的生命週期。

相關問題