4

相互に参照する 2 つの JPA2 エンティティ クラスがあります。

class Person {
   int id;
   String name;
   @ManyToOne(fetch = FetchType.LAZY)
   Company company;
}

class Company{
   int id;
   String name;
   @ManyToOne(fetch = FetchType.LAZY)
   Person representative;
}

このデータを持つ:

Company company1 = Company(1,"Company1", 2)
Company company2 = Company(2,"Company2", 1)

Person person1 = Person (1,"Person1", 1)
Person person2 = Person (2,"Person2", 2)

person2 は company2 で働いており、その代表者は person1 であり、その代表者は company1 で働いており、その代表者は再び person2 です。

Dozer はこのモデルを DTO (CompanyDTO および PersonDTO) にコピーできることを知っています。私のテストでは、それらは機能し、無限レベルの再帰があります。これは、Dozer がインスタンス化された同じオブジェクトを DTO の参照として使用するためだと理解しています。

私の質問は、何百もの企業を代表する何千人もの人がいるとしたら、PersonDTO インスタンスのグラフが大きすぎて処理できないのではないでしょうか? この状況に何らかの制限を指定するにはどうすればよいですか?

4

1 に答える 1

4

この状況に対処するには、2 つの戦略が考えられます。

  1. Dozer を呼び出す前に、データ モデルをループして、必要な深さまで遅延読み込みをトリガーします。次に、Dozer のプロキシ処理機能を使用して、オブジェクトをアンラップし、それ以上遅延読み込みをトリガーしないようにします ( http://dozer.sourceforge.net/documentation/proxyhandling.html )。Hibernate 用のプロキシ ハンドラがあります。Eclipse Link などを使用している場合は、独自のものを作成する必要があります。
  2. 必要なレベルまでオブジェクト階層をトラバースするカスタム コンバーター ( http://dozer.sourceforge.net/documentation/customconverter.html ) を記述します。これは、MapperAware 再帰カスタム コンバーターまたはレベル カウンターとして ThreadLocal を使用するプレーン コンバーターで実行できます。
于 2013-03-29T16:25:52.527 に答える