我对 JPA 继承有疑问。请参阅下面的我的实体。我有一个Person
可以在 aHouse
或 a中的 a 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
实际上实现了更多的接口。它们也映射到其他实体。 - The
Person
可以有一个所有可能的属性PersonHoldable
,所以在这种情况下它可以有一个getCar()
andgetHouse()
属性。这对我来说似乎不是很灵活。如果我要添加一个Bike
实现,PersonHoldable
我将不得不改变我的Person
班级。 PersonHoldable
我可以反过来映射,因此仅在实现方面具有 OneToOne 关系。这意味着getPerson()
向PersonHoldable
. 但是从一个Person
角度来看,PersonHoldable
它与什么相关联并不容易。- 我正在使用默认的 JPA,所以如果可能的话,没有 Hibernate 特定的标签。
如果默认 JPA 无法做到这一点,那么在这种情况下最佳实践是什么?