JPA混合继承战略

jFr*_*tic 6 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
}
Run Code Online (Sandbox Code Playgroud)

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

我尝试了这里提出的解决方案,但它对我不起作用.的属性BB1BB2也包括在内A.

如何实施这样的策略?类ACDog和Cat一样不同,所以我不能将它们合并为一个类.

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

Osw*_*Osw 5

JPA规范 (第2.12段)说Support for the combination of inheritance strategies within a single entity inheritance hierarchy is not required by this specification。请记住,在类似情况下,我通常对所有实体都使用JOINED策略。


jFr*_*tic 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
}
Run Code Online (Sandbox Code Playgroud)

结论
我很惊讶像 JPA 这样得到良好支持和流行的技术竟然没有为这样一个微不足道的案例提供解决方案。正如 Pascal Thivent 在回答这个问题时指出的那样,Hibernate使用 a 来欺骗我们secondary table,这是一种非常繁琐且容易出错的方法(您应该为每个字段手动指定它属于哪个表)。看来,JPA规范还有改进的空间。