部署后的JPA实体中的ClassCastException(Glassfish 3.1.2)

时间:2012-12-11 15:00:16

标签: jpa oracle11g eclipselink glassfish-3

使用Glassfish 3.1.2取消部署和部署WebArchive(.war)时会产生奇怪的效果。

$ 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时,我从未见过这个问题。有没有人看到错误并知道如何克服它?这不是一个大问题,但很烦人。

1 个答案:

答案 0 :(得分:9)

绑定到类加载器的资源将静态保存,直到关闭EntityManagerFactories。这些是应用程序管理的,因此您必须在不再需要时关闭工厂上的关闭或取消部署事件 - 垃圾收集也可以清理它们,但是在重新部署应用程序之前它没有发生并且再次访问它们不同的类加载器,导致你看到的异常。

坚持工厂并在不再需要时将其关闭,或使用注射并让容器为您管理它的生命周期。