2016-03-24 17 views
0

私はデータベースから取得したオブジェクトを返す非常に単純なWebサービスを持っています。エンティティを取得するためにspring-data-jpaリポジトリを使用しています。その後、変更を加えずにオブジェクトを返します。シリアル化のための非プロキシJPAエンティティ

私はエンティティ内にいくつかの遅延ロードされた関係を持ち、それらを "unfetched"のままにします。ただし、Webサービスがレスポンスオブジェクトをマーシャリングすると、レイジーフェッチがトリガされ、データベースへの追加呼び出しが行われます。

私は、Hibernateのコントロールからオブジェクトを動的に分離/削除/解除解除することができる必要があるため、データを遅延的に取得する必要があります。

私はfollowing methodを使用してオブジェクトのプロキシ解除を試みましたが、不運にはなりませんでした(私のエンティティはHibernateProxyオブジェクトではありません)。

データ呼び出しをトリガーせずにオブジェクトを自由に操作/シリアル化できるように、エンティティの「非ORM化」に最適なアプローチは何ですか?

+0

ORMが休止状態であれば、私はプロキシが 'HibernateProxy'になると思います。あなたが見ているプロキシのタイプは何ですか?私は 'AbstractPersistentCollection'に型キャストしようとしましたが、' forceInitialization() 'メソッドを呼び出そうとしませんでしたか? –

+0

なぜトランザクション境界がどこにあるのか、クラスは何かを示すいくつかのコードを提示しないでください。特定のフィールドをロードせずにオブジェクトを「デタッチ」することは可能です。他のJPAの実装ではこれを確実に処理できるため、 –

答えて

1

データ転送オブジェクト(DTO)はエンティティオブジェクトとは異なる要件を持つことが多く、この理由から私はカスタムDTOオブジェクトを作成するだけです。コンストラクタは通常、エンティティオブジェクトであり、必要な初期化フィールドをコピーするだけです。その後、遅延初期化の例外はなく、もう一方の側では使用されていないフィールドは含まれません。プロキシのすべてをハッキングしようとするよりもはるかに優れています、IMHO。

参考リンク:Difference between Transfer objects and Domain objects

+0

私はこのルートを終了しました。私はあなたに同意します。それは、プロキシの方法を欺くことがハッキーに思われていました。これはより良い選択肢のようです。さらに、DTOに非エンティティ関連のアノテーションをすべて削除して、データモデルとWebサービスの応答オブジェクトを一緒に壊すのではなく、そうでなければならないと思っていました。 –

関連する問題