0

Hibernate(JPA)を使用しているときに、次の呼び出しを行うと:

MyParent parent = em.getReference("myId");
parent.getAListMappedAsOneToMany().add(record) 
record.setParent(parent);

パフォーマンスの問題はありますか?

私の考えではgetReference、エンティティはロードgetAListeMappedAsOneToMany().addされず、レイジーフェッチとして定義されているため、リストをロードする必要はありません。

getAListMappedAsOneToManyget(呼び出しまたはsizeメソッドによって)実際にアクセスされた場合、非常に大きなリストを返す可能性があります。

そのようなコードでパフォーマンスの問題がないことを確認できますか?

4

2 に答える 2

2

getReference()データベースに移動せず、プロキシを返します。ただし、プロキシでメソッドを呼び出すと、プロキシが初期化され、データベースからエンティティデータが取得されます。したがって、エンティティを呼び出すため、の代わりにgetAListMappedAsOneToMany()呼び出すことによって何も得られません。getReference()find()

同様に、リストは遅延ロードされます。これは、メソッドを呼び出したときにのみロードされることを意味します。そして、あなたはそれにメソッドを呼び出します:add()。したがって、リスト内の要素のデータもデータベースからロードされます。

開発でSQLロギングをオンにして、Hibernateによって実行されるすべてのクエリを確認して理解します。

リストの読み込みを避けたい場合は、コードを次のように置き換えてください

MyParent parent = em.getReference("myId");
record.setParent(parent);

これはデータベースから何もロードせず、Record.parentが関連付けの所有者側であるため、関連付けが永続的になります。ただし、これにより、親が以前にロードされている場合は、メモリ内のオブジェクトグラフの一貫性が失われることに注意してください。

于 2013-02-14T11:12:30.800 に答える
1

getReference()オブジェクトのメンバーを使用せずに、オブジェクトの参照を別のオブジェクトに与える場合に便利です。たとえば、エンティティAがエンティティBを参照していて、bをAのBとして設定する場合は、それgetReference()が必要です。

しかし、あなたの場合、プロキシオブジェクトを取得すると、すぐにそのメンバーの1つに到達しようとします。(aListMappedAsOneToMany)したがって、これにより、parentオブジェクト全体がdbからロードされます。

確かに、getAListMappedAsOneToMany().add(record)設定した場合にのみ、dbからロードされません。inverse="true"

パフォーマンスの詳細については、http: //docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-collections-mostefficentinverseを参照してください。

于 2013-02-14T11:21:23.300 に答える