Glassfish v2 和 Glassfish v3 我也遇到了这个问题。
我可以问您一个问题:您是否尝试在部署应用程序时初始化任何持久性对象(通过启动时加载的 servlet 或上下文侦听器)?
像bguiz一样,我注意到这个问题只发生在重新部署时。新部署到新重新启动的 Glassfish 服务器,从来没有这个问题。
就像提到的FelixM一样,我确信这是一个类加载器问题,但我不认为这是多个战争的问题(我只有 1 个部署到我的服务器上)。在 Glassfish 3 中,我可以看到我的 WAR 使用了 2 个 Glassfish“引擎”。一个用于网络(战争),一个用于 jpa。据我了解,这些是不同的容器,每个容器都有自己的类加载器。我猜 Glassfish v2 的工作方式相同。
我正在使用 Spring 并在(重新)部署时(重新)初始化一些持久性对象。我在想的是,当 web 引擎重新初始化战争时,jpa 引擎仍在使用旧的类定义。通常,如果我在初始失败后重试重新部署,它可能会成功(有时可能需要多次重试,但最终我可以在不重新启动的情况下使其成功 - Glassfish v3 比 v2 更成功)。
在这一点上,我认为这两个类加载器不同步,或者重新部署时存在某种竞争条件,从而允许此操作有时成功。我试图强制类加载器,编写这样的代码
HashMap<Object, Object> properties = new HashMap<Object, Object>();
properties.put(PersistenceUnitProperties.CLASSLOADER, this.getClass().getClassLoader());
entityManagerFactory = Persistence.createEntityManagerFactory(jpaContext, properties);
但它似乎没有任何影响。
我还想知道在启动时消除初始化是否可以解决问题,让应用服务器有时间在使用任何 jpa 类之前重新同步两个引擎(这就是我问后续问题的原因)。