2012-12-11 57 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关闭。这些都是应用程序管理的,因此您必须在关闭时手动调用关闭工厂的关闭,或者在不再需要时取消部署事件 - 垃圾回收也可以清理它们,但在应用程序重新部署并再次访问它们之前,不会发生这种情况不同的类加载器,导致你看到的异常。

抓住工厂并在不再需要时关闭它,或者使用注射并让容器管理它的生命周期。

相关问题