JPA继承映射多个实现

时间:2013-06-04 08:58:02

标签: java hibernate jpa

我有JPA继承问题。请参阅下面的我的实体我有一个Person,可以是HouseCar,当然也不是同一时间。 CarHouse都实现了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中正确映射此内容并考虑以下因素?

  1. 我在@MappedSuperclass的抽象实现上尝试了PersonHoldable。虽然它适用于此特定设置,但问题是CarHouse实际上实现了更多接口。它们也被映射到其他实体。
  2. Person可能包含每个可能PersonHoldable的属性,因此在这种情况下,它可能具有getCar()getHouse()属性。这对我来说似乎不太灵活。如果我要添加Bike的{​​{1}}实施,我将不得不更改我的PersonHoldable课程。
  3. 我可以反过来映射,因此只在Person实现方面具有OneToOne关系。这意味着向PersonHoldable添加getPerson()属性。但是,从PersonHoldable角度来看,它与Person链接的内容并不容易。
  4. 我正在使用默认的JPA,所以如果可能的话,不要使用Hibernate特定的标签。
  5. 如果使用默认JPA无法做到这一点,那么在这种情况下最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

第二点的一个细微变化是使Person具有继承类型并实现CarPerson和HousePerson(以及后来的BikePerson),其目的是定义与特定PersonH​​older实现的特定连接关系。这使得关系保持完整,并且更容易从人员方面查询。

@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;
}