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