0

JPA 継承に問題があります。以下のエンティティを参照してください。もちろん同時にはありませんPerson。両方ともインターフェイスを実装します。エンティティをインターフェイスに直接マップできないことはわかっています。HouseCarCarHousePersonHoldable

これは私のモデルです:

@Entity
public class Person{
  private PersonHoldable personHoldable; // either a Car or a House

  // This does not work of course because it's an interface
  // This would be the way to link objects without taking JPA into consideration.
  @OneToOne 
  public PersonHoldable getPersonHoldable() {
    return this.personHoldable;
  }

  public void setPersonHoldable(PersonHoldable personHoldable) {
    this.personHoldable = personHoldable;
  }
}

@Entity
public class Car implements PersonHoldable{}

@Entity
public class House implements PersonHoldable{}

public interface PersonHoldable{}

以下を考慮して、JPAでこれを正しくマッピングするにはどうすればよいですか?

  1. @MappedSuperclassの抽象的な実装を試してみましたPersonHoldable。この特定のセットアップでは機能しますが、これに関する問題はCarHouse実際にはより多くのインターフェイスを実装することです。また、それらは他のエンティティにもマップされます。
  2. Person可能なすべての のプロパティを持つことができるPersonHoldableため、この場合はgetCar()andgetHouse()プロパティを持つことができます。それは私にはあまり柔軟に思えません。Bikeの実装を追加する場合、クラスPersonHoldableを変更する必要があります。Person
  3. 逆にマッピングできるので、PersonHoldable実装側でのみ OneToOne 関係を持ちます。getPerson()これは、にプロパティを追加することを意味しますPersonHoldable。しかし、それが何にリンクされているかを特定のPerson観点から見るのは容易ではありません。PersonHoldable
  4. デフォルトの JPA を使用しているため、可能であれば Hibernate 固有のタグはありません。

デフォルトの JPA でこれが不可能な場合、この場合のベスト プラクティスは何ですか?

4

1 に答える 1

1

2番目のポイントのわずかなバリエーションは、 Person に継承タイプを持たせ、特定の PersonH​​older 実装への特定の結合関係を定義することを全体の目的とする CarPerson と HousePerson (および後で BikePerson) を実装することです。これにより、リレーションシップが損なわれず、Person 側からより簡単にクエリできるようになります。

@Inheritance(strategy = JOINED)
@DiscriminatorColumn(name="holdableType", discriminatorType=CHAR, length=1)
@Entity
public class Person {
    // common fields
}

@Entity
@DiscriminatorValue("C")
public class CarPerson extends Person {
    @OneToOne
    private Car car;
}

@Entity
@DiscriminatorValue("H")
public class HousePerson extends Person {
    @OneToOne
    private House house;
}
于 2013-06-04T09:32:25.347 に答える