JPA混合继承战略

时间:2011-10-06 20:40:42

标签: java hibernate jpa-2.0

我有3个实体:

@Entity
public abstract class A {
  @Id
  public Long id;
  public String a1;
  public String a2;
  public String a3;

  //much more fields    
  //getters and setters
}

@Entity
public class B extends A {
  public String b1;
  public String b2;
  public String b3;

  //much more fields
  //getters and setters
}

@Entity
public class C extends A {
  public String c;
  //that's it. no more data

  //getters and setters
}

我想将这些类映射到2个表。第一个将包含所有AC数据(即SINGLE_TABLE继承)。第二个将包含B的数据和A的外键(即JOINED继承)。

我尝试了提议的解决方案here,但它对我不起作用。 BB1BB2的属性也包含在A中。

如何实施这样的策略?类AC与Dog和Cat一样不同,因此我无法将它们合并到一个类中。

此外,我不想使用每层次表格,这会导致重复大量A的数据。

2 个答案:

答案 0 :(得分:5)

JPA spec(第2.12段)说Support for the combination of inheritance strategies within a single entity inheritance hierarchy is not required by this specification。 牢记这一点,在类似的情况下,我通常会对所有实体使用JOINED策略。

答案 1 :(得分:1)

花了这么多时间,没有得到任何答案,我来到这个解决方案(可能不是最好的):

@Entity
public abstract class A implements Serializable {
  @Id
  public Long id;

  public String a1;
  public String a2;
  public String a3;

  //much more fields    
  //getters and setters
}

@Entity
public class B implements Serializable {

  @Id  
  @Column(name="id", nullable=false)  
  public Long id;

  @MapsId  
  @OneToOne(optional=false)  
  @JoinColumn(name="id")  
  public A a;

  public String b1;  
  public String b2;  
  public String b3;

  //much more fields
  //getters and setters
}

@Entity
public class C extends A {  

  public String c;
  //that's it. no more data

  //getters and setters
}

<强>结论
我很惊讶JPA如此支持和流行的技术如何为这样一个微不足道的案例提供解决方案。正如Pascal Thivent在回答this问题时指出的那样, Hibernate 使用secondary table欺骗我们,这是一种非常乏味且容易出错的方法(你应该这样做)为每个字段手动指定它所属的表。所以看起来, JPA 规范还有改进的余地。