web-dev-qa-db-ja.com

EntityManager.find()とEntityManager.getReference()の違いは何ですか?

違いは何ですか

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

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

確認してください。


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

EntityManager.remove(Object entity)

管理対象エンティティをentitymanagerに渡すには、メソッド 'remove the better and correct option?を削除します。 findまたはgetReference? '

45
user237673

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

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

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

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

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

72
Daniel

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

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

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

8
Eelke

Beginning Java EE 6 Platform with GlassFish 、ページ135の違いに言及:「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
}
_
7
Jaider