48

違いは何ですか

<T> T EntityManager.find(Class<T> entityClass, Object primaryKey) and 
<T> T EntityManager.getReference(Class<T> entityClass, Object primaryKey) 

?

管理されている場合、 getReference はエンティティを返すと思います。それが管理されている場合、検索はエンティティを返します。それ以外の場合は、データベースでSQLを実行して管理されます。

確認してください。


コンテキスト: webapp から、削除するオブジェクトの主キーを取得します (タイプ long の pk)。エンティティへの削除を管理する必要があります。

EntityManager.remove(Object entity)

管理されたエンティティをentitymanager removeメソッドに渡すには、「より適切で正しいオプションは何ですか? find または getReference?'

4

3 に答える 3

79

ご存じのように、JPA には EntityManager の概念があります。エンティティ マネージャでの作業中に、いくつかのオブジェクトがデータベースからロードされ、変更して後でデータベースにフラッシュすることができます。

find()オブジェクトの初期化されたインスタンスを返す必要があります。EntityManager にまだロードされていない場合は、データベースから取得されます。

getReference()エンティティが以前に EntityManager にロードされていない場合、初期化されたインスタンスの代わりにプロキシを返すことができます。このプロキシでは、主キー属性のみが初期化されます。初期化された唯一の属性がすでに getReference() 関数に与えられているため、データベースにヒットすることなくプロキシを作成できます。

後者は、エンティティ B を参照するエンティティ A があり、データベースから B をロードすることなく、A の b 属性を B に設定する場合に役立ちます。

B の他の属性を参照する場合にのみ、プロキシが初期化されます。

于 2011-03-30T06:02:18.767 に答える
9

getReference()はオブジェクト全体を取得するのではなく、プロキシのみを取得するため、オブジェクトのメンバーにアクセスしない方が効率的です。

たとえば、データベースに挿入する新しいオブジェクトを作成する場合、データベースに既に格納されている別のオブジェクトを参照する必要がある場合があります。

JPA が新しいオブジェクトを正しく格納するには、参照されるオブジェクトの主キーのみが必要です。を使用getReference()することで、主キーを含むプロキシを取得し、完全なオブジェクトをロードするコストを節約できます。

于 2011-03-30T05:40:05.290 に答える
9

Beginning Java EE 6 Platform with GlassFish 3という本では、135 ページの「Finding By ID」で違いについて言及しています。

find()エンティティが見つかった場合は返されます。見つからない場合は、NULL 値が返されます。

MyEntity obj = em.find(MyEntity.class, id);
if(obj != null){
   // Process the object 
}

getReference()これは、マネージド エンティティ インスタンスが必要であるが、潜在的にエンティティの主キー以外のデータがアクセスされていない状況を対象としています。

try {
    MyEntity obj = em.getReference(MyEntity.class, id);
    // Process the object
} catch (EntityNotFoundException e) {
    // Entity Not Found
}
于 2013-02-27T23:02:43.573 に答える