4

JPA の同じフィールドに @JoinColumn と @Column の両方を使用して、両方からの更新を有効にすることはできますか?

次のようなエンティティがあるとします。

@Entity
public class Person{
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    @ManyToOne
    private Address address;

    // getters and setters
}

Address オブジェクトが既に存在すると仮定すると、このオブジェクトを作成するときは、Person を永続化する前にデータベースからアドレスをフェッチする必要があります。これは私のアプリケーション全体の現在の設計ですが、パフォーマンスの問題を引き起こす可能性があります。実際のオブジェクトを保持する可能性を維持しながら、ID のみを使用して保持する可能性を追加することは可能ですか (他の場所で大量のコードを変更する必要がないため)。このようなもの

@Entity
public class Person{
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    @ManyToOne
    private Address address;

    @Column(name="address_id")
    private Integer addressId;

    // getters and setters
}

em.persist(new Person(1));
em.persist(new Person(getAddress(1)));

これらの持続行の両方を許可するように注釈を付けることは可能ですか? 私の現在の信念は、フィールドの1つが持つ必要があるということですinsertable = false

4

1 に答える 1

2

競合が発生する可能性があるため、このような重複マッピングは不可能です。addressフィールドを ID = X のアドレスに設定し、次にaddressId別の ID = Yに設定するとどうなるでしょうか? 保存時にJPAが考慮する必要があるのはどれですか? そのため、それを指定してそれらのフィールドの 1 つを作成する必要がありますinsertable=false, updatable=false

あなたの問題の解決策はEntityManager.getReference()メソッドです。実際にDBからロードすることなく、指定されたクラスとIDの「プロキシ」オブジェクトを返します。このようにして、オブジェクトにaddress参照を設定してPerson永続化できます。

em.persist(new Person(em.getReference(Address.class, 1)));

addressIdこのソリューションのおかげで、フィールドはまったく必要ありません。

于 2013-08-01T13:09:23.773 に答える