Glassfish v2 と Glassfish v3 でもこの問題が発生しています。
質問をしてもよろしいですか:アプリケーションのデプロイ時に (起動時にロードされたサーブレットまたはコンテキスト リスナーを介して) 永続化オブジェクトを初期化しようとしていますか?
bguizと同様に、この問題は再デプロイ時にのみ発生することに気付きました。新しく再起動した Glassfish サーバーへの新しいデプロイでは、この問題は発生しません。
FelixMが述べたように、これはクラス ローダーの問題であると確信していますが、複数の戦争の問題ではないと思います (サーバーにデプロイされているのは 1 つだけです)。Glassfish 3 では、WAR が 2 つの Glassfish "エンジン" を利用していることがわかります。1 つは Web (戦争) 用で、もう 1 つは jpa 用です。私が理解していることから、これらはそれぞれ独自のクラスローダーを持つ異なるコンテナーです。Glassfish v2 も同じように動作すると思います。
私はSpringを使用しており、(再)デプロイ時にいくつかの永続オブジェクトを(再)初期化しています。私が考えているのは、Web エンジンが戦争を再初期化している間、jpa エンジンはまだ古いクラス定義を使用しているということです。多くの場合、この最初の失敗の後に再デプロイを再試行すると、成功する場合があります (複数回の再試行が必要になる場合もありますが、最終的には再起動せずに成功することができます - v2 よりも Glassfish v3 の方が成功しています)。
この時点で、これら 2 つのクラスローダーが同期していないか、再デプロイ時にある種の競合状態が発生して、この操作が成功することがあると考えています。このようなコードを書いて、クラスローダーを強制しようとしました
HashMap<Object, Object> properties = new HashMap<Object, Object>();
properties.put(PersistenceUnitProperties.CLASSLOADER, this.getClass().getClassLoader());
entityManagerFactory = Persistence.createEntityManagerFactory(jpaContext, properties);
しかし、それは何の影響も与えていないようでした。
また、起動時の初期化をなくすことで問題が解決し、jpa クラスを使用する前に両方のエンジンを再同期する時間を appserver に与えることができるかどうかも疑問に思っています (これが、フォローアップの質問をした理由です)。