4

私の質問は EntityManager.getReference に関するものです。私が 1 つの JPA セッションにいるとすれば、同じエンティティと同じ主キーに対する EntityManager.getReference への 2 回の呼び出しで、Java オブジェクトの同じインスタンスを常に取得できると確信できますか? 2 つの異なるセッションでは、Java オブジェクトの 2 つの異なるインスタンスを取得すると思われますが、本当にそうなのですか?

特定の実装がどのように機能するかではなく、一般的なルールを知りたいです。仕様で定義されていますか?(自分では見つけられませんでした。)

Person p1 = EntityManager.getReference(Person.class, 1L);
Person p2 = EntityManager.getReference(Person.class, 1L);

if (p1 == p2) {
  System.out.println("SAME");
} else {
  System.out.println("DIFF");
}
4

1 に答える 1

3

はい、これは JPA の基本的な保証です。永続化コンテキスト (つまり、セッション) の範囲内で、管理対象EntityManagerエンティティのオブジェクト ID はデータベース ID と一致します。

7.1 永続コンテキスト

永続コンテキストは、永続エンティティ ID に対して一意のエンティティ インスタンスが存在する一連の管理対象エンティティ インスタンスです。

getReference()マネージド インスタンスを返します。

3.2.8 マネージド インスタンス

...

contains() メソッドを使用して、エンティティ インスタンスが現在の永続化コンテキストで管理されているかどうかを判断できます。

contains メソッドは true を返します。

  • エンティティがデータベースから取得されたか、getReference によって返され、削除または分離されていない場合。
  • エンティティ インスタンスが新しく、エンティティで永続化メソッドが呼び出されているか、永続化操作がエンティティにカスケードされている場合。

find()さらに、この保証は、永続化コンテキストのスコープ内で、取得方法 ( 、getReference()merge()クエリ、または関係トラバーサルを介して) に関係なく、同じ ID のエンティティの同じインスタンスを取得することを意味します。

たとえば、getReference()そのエンティティでの以降のすべての作業からプロキシを取得した場合、そのプロキシを介して行われます。

Person p1 = EntityManager.getReference(Person.class, 1L); 
Person p2 = EntityManager.find(Person.class, 1L); 
assertSame(p1, p2);

以下も参照してください。

于 2012-06-13T08:53:31.077 に答える