gpt4 book ai didi

java - @Inheritance默认为SINGLE_TABLE,还是默认为 "fallthrough"或SINGLE_TABLE?

转载 作者:行者123 更新时间:2023-11-30 04:52:09 24 4
gpt4 key购买 nike

考虑以下场景:

(以下内容已被省略:构造函数、Getters 和 Setters、@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 和 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”?如果注释存在,但没有定义策略怎么办?

最佳答案

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

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

在本例中,层次结构的根是 A,并且显式指定了 JOINED,因此每个实体都有表。

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

正如您所指出的,如果存在注释,则策略为 SINGLE_TABLE 除非明确指定。由于 Javadoc 和 Spec 引用了类层次结构中 @Inheritance 的处理,我认为如果当前类没有注释,我会查找父类并向上查找树,直到我要么找到注释,要么到达类层次结构的根(默认为 SINGLE_TABLE)

关于java - @Inheritance默认为SINGLE_TABLE,还是默认为 "fallthrough"或SINGLE_TABLE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9620869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com