JPA 継承に問題があります。以下のエンティティを参照してください。もちろん同時にはありませんPerson
。両方ともインターフェイスを実装します。エンティティをインターフェイスに直接マップできないことはわかっています。House
Car
Car
House
PersonHoldable
これは私のモデルです:
@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 でこれが不可能な場合、この場合のベスト プラクティスは何ですか?