4

同じglassfish(3.1最終バージョン)でエンティティBean(JPA 2 / Eclipselink)を返す別のWebアプリケーションからリモートステートレスEJBを呼び出す必要があります。依存関係インジェクション(@EJB)を介してWebアプリケーションでejb参照を取得していますが、エンティティはnullになります。私はそれをグーグルで検索し、それがシリアル化可能な問題である可能性があることを発見しました。どこかでこれを見つけました

TopLinkは、読み込み時にエンティティクラスを変更する(「織り込む」)か、実行時にコレクションアクセスを置き換えて、遅延アクセスまたは変更された関係を検出できるようにします(これがない場合、または実行時にプロキシをサブクラス化または使用することなく、遅延読み込みをサポートする方法はありません)。これは非常に重要なポイントになります:エンティティにアクセスするためにリフレクションを使用するのではなく、そのビジネスメソッドを介してのみ使用する必要があります。織り込まれたエンティティがサーバーでシリアル化され、対応するエンティティが織り込まれていないクライアントで逆シリアル化される場合、値の計算にはクラスフィールドとメソッドが含まれるため、serialVersionUIDは一致しません。

だから私は私のアプリケーションでDTO変換が必要ですか?

4

3 に答える 3

2

Glassfish バグ 16164 の影響を受けている可能性があります。

推奨される回避策は、このプロパティを persistence.xml に追加することです。

<property name="eclipselink.weaving" value="false"/>

私の場合、それは問題を解決しました。

于 2011-07-11T20:27:00.120 に答える
2

「しかしエンティティがnullになる」とはどういう意味ですか? リモートの SessionBean でメソッドを呼び出して null を返すか、関係が null の Entity を返すか。

null リレーションシップの場合は、LAZY の問題である可能性があります。リレーションシップが LAZY で、フェッチもアクセスもされていない場合は、null になります。取得するか、アクセスするか、または EAGER にする必要があります。

null が返される場合は、別の何かが間違っています。

于 2011-04-11T13:47:47.247 に答える
0

エンティティを返そうとすると、EclipseLink と Glassfish を使用したリモート EJB がうまく機能しません。

Hibernate の場合も同様です。応答を返す前に、すべてのプロキシを削除する必要があります。Hibernate では、プロキシを削除する前に永続化コンテキストをフラッシュしてクリアする必要があります。ロードされていない場合は、null を属性に設定します。Java EE インターセプターで動作させることができます。

ただし、EclipseLink は Hibernate のようには機能しません。永続コンテキストをクリアしても、遅延属性の get / set はフェッチを試みます。外取引でも。

property name="eclipselink.weaving" value="false" を設定すると、EclipseLink が POJO クラスのバイトコードを変更しないため機能しますが、ManyToOne は常にフェッチされます。したがって、データベースをメモリにロードできます。

これを解決する唯一の方法は、DTO を使用するか、インターセプターで Hibernate を使用することです。

EDIT : Externalization インターフェイスを使用して、エンティティのシリアル化をいつでもオーバーライドできます。フィールドでオブジェクトを取得して、遅延フェッチが適用されないようにします。

Openjpa もデフォルトで weaving メソッドを使用しているようです。http://openjpa.apache.org/entity-enhancement.html

于 2015-01-04T17:42:15.670 に答える