我有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()
和getHouse()
属性。这对我来说似乎不太灵活。如果我要添加Bike
的{{1}}实施,我将不得不更改我的PersonHoldable
课程。Person
实现方面具有OneToOne关系。这意味着向PersonHoldable
添加getPerson()
属性。但是,从PersonHoldable
角度来看,它与Person
链接的内容并不容易。如果使用默认JPA无法做到这一点,那么在这种情况下最佳做法是什么?
答案 0 :(得分:1)
第二点的一个细微变化是使Person具有继承类型并实现CarPerson和HousePerson(以及后来的BikePerson),其目的是定义与特定PersonHolder实现的特定连接关系。这使得关系保持完整,并且更容易从人员方面查询。
@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;
}