6

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

4

1 回答 1

10

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

保留工厂并在不再需要时将其关闭,或者使用注入并让容器为您管理其生命周期。

于 2012-12-11T15:36:58.927 回答