1

「ペルソナ」エンティティ にこの関係があります

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "persona")
private Empleado empleado;

私の「Empleado」エンティティには、この関係があります

@OneToMany(cascade = CascadeType.ALL, mappedBy = "empleado", fetch = FetchType.EAGER)
private Set<Trabajo> trabajos = new HashSet<Trabajo>();

そして、私は「Trabajo」エンティティにこの関係を持っています

@BatchSize(size = 100)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "trabajo", fetch = FetchType.LAZY)
private Set<Atencion> atenciones = new HashSet<Atencion>();

そしてGoogleCodeが提供するこのログイン方法

@Override
public Persona acceder(String login, String password) {
    Search s = new Search();
    s.addFilterEqual("usuario", login);
    s.addFilterEqual("clave", password);
    return searchUnique(s);
}

EAGER フェクトを持つオブジェクトをロードした結果オブジェクトを取得すると、「Trabajo」エンティティ以外はすべて問題ありません。どうすればこれを修正できますか?

私のTrabajoエンティティには、LAZYフェッチを持つ他の@OneToMany関係があり、理由がわからないオブジェクトをロードしています。

dozer mapperService を使用すると、すべてのツリー オブジェクト全体がマップされ、表示されるはずのないオブジェクトがすべて表示されます。

4

2 に答える 2

3

遅延読み込みは、データが読み込まれないという意味ではありません。これは、ユーザー (この場合は Dozer) が値を要求した場合にのみ、データがロードされることを意味します。

エンティティ Manager があり、エンティティ Worker を持つ OneToMany があるとします。そして、関連付けが遅延ロードされているとします。何が起こるかは次のとおりです。

Manager manager = session.get(Manager.class, 1L); 
// the above line loads the manager data from the database, using a SQL query

List<Worker> workers = manager.getWorkers();
// the workers variable references a Hibernate-specific list which is lazy-loaded.
// It doesn't contain any data until a method is called on it

int size = workers.size();
// calling any method of the list will cause a SQL query to be executed. This
// SQL query will load the workers of the manager from the database, and fill the list
// finally, the size of the list will be returned.

本当に必要なときにだけロードされるため、怠惰です。

そのため、Dozer を使用してマネージャーをマッピングするときにワーカーをマネージャーに返したくない場合は、Dozer がワーカーを取得しようとしないようにしてください。これを行うには、2 つの簡単な解決策があります。

  • ドーザーを使用しないでください(これは最悪です、私見)
  • ManagerエンティティをManagerDTOワーカー リストを含まないクラスにマップします。
于 2013-02-24T17:59:27.460 に答える
0

遅延読み込みについてのわかりやすい説明がここにあります。表示されているのはプロキシ オブジェクトである可能性があります。実行された sql をチェックして、データが実際に db からロードされているかどうかを確認します。「Atencion」に関連するテーブルにクエリがない場合は心配しないでください。

ドーザー マッピングが 'atenciones' 要素にアクセスしている可能性があります。これにより、db からレコードがロードされます。これが発生したくない場合は、特定のフィールドをマッピングから除外する方法が必要です。

于 2013-02-24T15:53:02.957 に答える