2012-04-11 11 views
0

JPA 2.0には、埋め込みオブジェクトが1つのオブジェクトのみで埋め込まれていても複数ではないことがありますか?JPA 2.0:1つのエンティティ専用の埋め込みオブジェクト

私の場合、AddressCustomerに割り当てることができます。すべての顧客が独自のアドレスオブジェクトを使用し、2人の顧客が実際に同じオブジェクトを共有しないようにする制約を作成したいと考えています。

私のコードは次のようになります。

@Entity 
public Customer { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Embedded 
    private Address address; 

    // .. 
} 

@Embeddable 
public Address { 
    private String street; 
    private String city; 

    // .. 
} 

を現在、私は、その後持続し、それらを読んで、彼らは再び同じIDを持つオブジェクトを共有し、2人の顧客を作成し、それらに同じAddressオブジェクトを割り当てた場合。私は他の顧客と住所を共有するそのような顧客を救うことを禁止したい。

+0

...本当にJPA標準規格に準拠していません私はあなたのポイントを理解していれば、あなたはユニークを作成したいと思いますデータのアドレスが同じであってもアドレス入力? – Phani

+0

@Phani正確に。将来の住所変更は、その住所を保持している顧客だけに影響を及ぼし、他の顧客には副作用がないようにする必要があります。これを解決するためのJavaの1つの方法は、設定時にアドレスのコピーを作成することです(私は仮定します)。しかし、私はJPAベースのソリューションを探しています。 – riwi

+1

equalsメソッドをオーバーライドしなかった場合は、2つのエントリをデータベースに格納するのが理想的です。アクションのために生成されたsqlをチェックして、何が原因でそれが1として格納されているのかを確認してください。 – Phani

答えて

1

この場合、最も簡単なアプローチはAddressオブジェクトのコピーをCustomer.setAddress()に作成することです。

また、別のCustomerAddressと同じアイデンティティーでデータベースから取得したものを共有できるかどうかはわかりません。おそらく同じセッションでそれらを保存して読み込むので、セッションキャッシュから同じオブジェクトを取得することになります。

1

埋め込み可能なクラスの埋め込みインスタンスは、囲むクラスの異なるインスタンス間で共有されないことが@埋め込み型メカニズムの性質です。あなたのコードでこの動作を観察した場合は、エンティティマネージャからの読み込み中にキャッシュされたデータにアクセスしていたからでしょう。 したがって、エンベッド可能クラスの同じインスタンスを囲んでいるクラスの複数のインスタンスに割り当ててから、 "persist()"を実行してから、エンティティマネージャとEntityManagerFactoriesを破棄したり、キャッシュを無効にしたりする "entityManager.getEntityManagerFactory()。getCache ).evictAll() "を作成し、新しいEntityManagerを作成し、囲みオブジェクトを" find() "し、それぞれの内容が同じであっても(それぞれのケースで)" Address "オブジェクトのインスタンスを持たなければなりません。

JPAの仕様は、セクション2.5に埋め込まれたオブジェクトについては、次の言葉:

[...]これらのクラスのインスタンスは、エンティティインスタンスとは異なり、自分自身の 永続的なアイデンティティを持っていません。代わりに、それらは属しているエンティティの状態である の一部としてのみ存在します。 [...]

をあなたのJPA実装がそれに従わない場合、それは

関連する問題