@Inheritance默认为SINGLE_TABLE,还是默认为“fallthrough”或SINGLE_TABLE?

时间:2012-03-08 16:10:55

标签: java annotations jpa-2.0

考虑以下情况:

(以下内容已被省略:构造函数,Getter和Setter,@ Column注释,@ Basic注释,@ Table注释,导入和包声明。其余的完全按照我的意图(甚至是空注释))

@Inheritance(strategy=InheritanceType.JOINED)
@Entity
public class A {
    @Id @GeneratedValue
    private long id;
    private String aValue;//There are getters and setters for this, but I omitted them
}

@Entity    
public class B extends A {
    private String bValue;
}

//Missing @Inheritance here - JPA2 says "default" @Inheritance if it is missing
//But what does that mean?
@Entity
public class C extends A {
    private String cValue;
}

@Entity
public class D extends C {
    private String dValue;
}

//Missing strategy, whose default, according to the annotation interface, is SINGLE_TABLE
@Inheritance
@Entity
public class E extends C {
    private String eValue;
}

@Entity
public class F extends E {
    private String fValue;
}

@Entity
public class G extends E {
    private String gValue;
}

没有语法的类的快速摘要:

A (@Inheritance(strategy=InheritanceType.JOINED)
B, C (no annotation)
   D, E (@Inheritance)
      F, G

如果你要遵守JPA的规范,那么应该有

  • A:A,B,C,D,E,F和G的表格,全部包含id + classValue
  • B:A,B,C,D和{EFG}的表格,A,B,C和A表格。 D包含id + classValue,{EFG}包含id + eValue + fValue + gValue + DTYPE
  • C:A,B和{CDEFG}的表格,A和B包含id + classValue,{CDEFG}包含id + cValue + dValue + eValue + fValue + gValue + DTYPE

还是其他一些我还没想过的场景? 我会测试它,但我不确定它是否是JPA的实现或规范本身填补了“当@Inheritance注释没有丢失但是有一个未定义的策略时会发生什么”的空白? 就个人而言,我很确定C不会发生,但我不知道它是否会像A或B那样映射。

因此问题标题: @Inheritance默认为“SINGLE_TABLE”(无论是丢失还是未定义),还是默认为“fallthrough”(检查上面的实体层次如何处理事情),如果不可能,“SINGLE_TABLE”?如果注释存在,但没有定义策略会怎么样?

3 个答案:

答案 0 :(得分:2)

我认为正确答案是“这取决于您的实施”。来自JSR规范(JSR317§2.12“继承映射策略”):

  

此规范不要求在单个实体继承层次结构中支持继承策略的组合。

在这种情况下,层次结构的根是A,显式指定了JOINED,那么每个实体都有表。

现在,如果您的JPA实现支持每个层次结构的多个继承类型,从注释的Javadoc和Source判断,我个人希望有A,B,C,D,{EFG}的表格

正如您所指出的,如果注释存在,除非明确指定,否则策略为SINGLE_TABLE。由于Javadoc和Spec在类层次结构方面引用@Inheritance的处理,我认为如果当前类没有注释,我会查看父级和树,直到我找到一个注释,或者我到达类层次结构的根(并默认为SINGLE_TABLE

答案 1 :(得分:1)

对我而言,它并非100%明确,在JPA 2.0规范中遵循

Support for the combination of inheritance strategies within a single entity 
inheritance hierarchy is not required by this specification.

意思是:

  1. 如果实施,应该遵守所提出的所有其他限制(大多数 可能)或
  2. 如果实施,可以放松提出的其他限制。
  3. 幸运的是,参考实现选择了第一个选项。 EclipseLink @Inheritance没有参数默认为单个表,并且没有@Inheritance注释所有荣誉@Inheritance注释从超类中找到(不一定是直接超类)。这些实体将映射到五个表:

    • A:id dtype avalue
    • B:id bvalue
    • C:id cvalue
    • D:id dvalue)
    • E:id evalue,fvalue,gvalue

    (B-E id为FK到A id)

    持久化实体按预期工作,每个实体也保存到超类表中而没有问题。

答案 2 :(得分:-1)

你需要添加带有discriminator参数的inheritanse注释来查看关于这些东西的所有信息,只需访问[链接] http://www.java2s.com/Code/Java/JPA/SetDiscriminatorValue.htm