1

私はEclipselinkを使用しており、基本的にデータベースにblobとして格納されているgzip圧縮されたデータのバイト配列であるJPAエンティティを持っています。ただし、このデータは、バイト配列を管理し、正しくデコードできるクラス(GzipByteArray)にラップされています。@Converterアノテーションと@Convertアノテーションを使用して、データベースの内部byte[]配列からGzipByteArrayラッパークラスに変換しました。エンティティは、実際にはGzipByteArrayクラスを変数タイプとして格納します。それはすべて問題なく動作します。

ただし、GzipByteArrayにテキストを追加する場合は、そのメソッドを呼び出してテキストを追加します。Eclipselinkは、親Entityクラスのこのパラメーターへの変更を検出していません。

GzipByteArrayに.equals()メソッドと.hashCode()メソッドを配置して、内部のbyte[]配列の変更が考慮されていることを確認します。それは役に立ちません。私のロギングステートメントに基づくと、.equals()はEclipselinkによっても呼び出されていません。

変更を検出する唯一の方法は、GzipByteArrayの新しいインスタンスを作成し、セッターを使用してそれを変更することです。

EclipselinkはデフォルトのDeferredChangeDetectionPolicyを使用していると思います。これはどのように作動しますか?Eclipselinkのソースもダウンロードしましたが、わかりません。どういうわけか、このフィールドを「ダーティ」として手動でマークすることはできますか?Eclipselinkがオブジェクトを検出するには、オブジェクトのインスタンスIDを変更する必要がありますか?

4

1 に答える 1

0

コンバーターでは、isMutable()に対してtrueを返す必要があります。これにより、EclipseLinkが遅延変更検出を使用するようになります。マッピングに@Mutableを追加することもできます。

可能であれば、可変を使用する代わりに、値を変更するときにsetメソッドを呼び出す方が効率的です。これにより、EclipseLinkは、コミットごとに変更についてバイト配列全体を比較する代わりに、属性変更追跡を使用できるようになります。

于 2012-05-17T13:31:45.337 に答える