私は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を変更する必要がありますか?