考虑以下情况:
(以下内容已被省略:构造函数,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的规范,那么应该有
还是其他一些我还没想过的场景? 我会测试它,但我不确定它是否是JPA的实现或规范本身填补了“当@Inheritance注释没有丢失但是有一个未定义的策略时会发生什么”的空白? 就个人而言,我很确定C不会发生,但我不知道它是否会像A或B那样映射。
因此问题标题: @Inheritance默认为“SINGLE_TABLE”(无论是丢失还是未定义),还是默认为“fallthrough”(检查上面的实体层次如何处理事情),如果不可能,“SINGLE_TABLE”?如果注释存在,但没有定义策略会怎么样?
答案 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.
意思是:
幸运的是,参考实现选择了第一个选项。 EclipseLink @Inheritance没有参数默认为单个表,并且没有@Inheritance注释所有荣誉@Inheritance注释从超类中找到(不一定是直接超类)。这些实体将映射到五个表:
(B-E id为FK到A id)
持久化实体按预期工作,每个实体也保存到超类表中而没有问题。
答案 2 :(得分:-1)
你需要添加带有discriminator参数的inheritanse注释来查看关于这些东西的所有信息,只需访问[链接] http://www.java2s.com/Code/Java/JPA/SetDiscriminatorValue.htm