0

JPA 2.0 で、埋め込みオブジェクトが複数ではなく 1 つのオブジェクトだけに埋め込まれていることを保証する可能性はありますか?

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

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

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

    @Embedded
    private Address address;

    // ..   
}

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

    // ..
}

現在、2 人の顧客を作成して同じオブジェクトを割り当てAddress、永続化して読み取ると、再び同じ ID でオブジェクトを共有します。他のお客様と住所を共有しているお客様の保存を禁止したい。

4

2 に答える 2

1

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

JPA仕様では、セクション2.5の埋め込みオブジェクトについて次のように述べています。

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

JPA実装がそれに準拠していない場合、実際にはJPA標準に準拠していません...

于 2015-05-21T14:19:01.733 に答える
1

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

また、データベースから取得したときに、異なる が同じ ID とCustomer共有できるかどうかもわかりません。Address同じセッションでオブジェクトを保存して読み取るため、セッション キャッシュから同じオブジェクトを取得する可能性があります。

于 2012-04-11T15:09:36.620 に答える