这些 JPA 注释是什么意思?
What do these JPA annotations mean?
能否请您用通俗易懂的 "human" 语言解释一下这些注释的含义。我不需要文档,我只想听到类似 tAttr table 通过主键 InstitID 与 tInstit table 连接的内容,约束如下等等。 SQL 语言没问题 :) 我有点困惑。谢谢
我有这个映射class
@Entity
@DiscriminatorValue("Individual")
@SecondaryTable(schema = "dbo", name="tAttr", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "InstitID")})
public class FaIndividual extends FaClient
它扩展了这个:
@Entity
public abstract class FaClient extends FaInstit
及以上扩展
@Entity
@Immutable
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula(
"CASE "
+ "WHEN ((InstType = 0) AND (PropDeal = 0)) THEN 'Individual' "
+ "WHEN ((InstType = 0) AND (PropDeal = 1)) THEN 'Legal' "
+ "WHEN (InstType = 1) THEN 'Bank' "
+ "WHEN (InstType = 2) THEN 'Subdivision' "
+ "END"
)
@Table(schema = "dbo", name = "tInstit")
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class FaInstit
你的 classes FaInstit
(<--Extends) FaClient
(<-- Extends) FaIndividual
都被注释 @Entity
这意味着这些是持久性 classes,它们的字段映射到 DB tables/columns.
在您的超级 class FaInstit
中,您指定继承层次结构中的所有实体都将共享相同的主 table - dbo.tInstit
– 与注释 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
当对所有实体使用单个 table 时,您需要将 table 中的每条记录标识为属于 class 中的一个或另一个。这是通过 @DiscriminatorColumn
完成的(如果您跳过此注释,将选择默认列名)。 DiscriminatorColumn 中的值可以使用 @DiscriminatorValue
注释指定。因此,每当您坚持使用 FaIndividual
时,DiscriminatorColumn 中的值将是 Individual.
有时我们需要一个实体映射到多个 table。您示例中的主要 table 是 dbo.tInstit
,但我们可以使用 @SecondaryTable
注释定义任意数量的次要 table。您已在 FaIndividual
中完成此操作,您应该在 class 的定义(未显示)中看到 class 的字段映射到 table 中的任何一个。 secondarytable使用的行由@SecondaryTable
属性中的join信息定义;
pkJoinColumns = {@PrimaryKeyJoinColumn(name = "InstitID")}
所以我们有一个连接 where dbo.tInstit.ID = dbo.tAttr.InstitID
,JPA 将 update/read 根据这个连接信息等跨越两个 table 的实体字段。
您已声明
I don't want documentation
但恐怕这正是您所需要的,因为这里有很多东西要学。我建议挖掘一些 tutorials/examples 涵盖这种领域。
我希望这能让你继续下去。
能否请您用通俗易懂的 "human" 语言解释一下这些注释的含义。我不需要文档,我只想听到类似 tAttr table 通过主键 InstitID 与 tInstit table 连接的内容,约束如下等等。 SQL 语言没问题 :) 我有点困惑。谢谢
我有这个映射class
@Entity
@DiscriminatorValue("Individual")
@SecondaryTable(schema = "dbo", name="tAttr", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "InstitID")})
public class FaIndividual extends FaClient
它扩展了这个:
@Entity
public abstract class FaClient extends FaInstit
及以上扩展
@Entity
@Immutable
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula(
"CASE "
+ "WHEN ((InstType = 0) AND (PropDeal = 0)) THEN 'Individual' "
+ "WHEN ((InstType = 0) AND (PropDeal = 1)) THEN 'Legal' "
+ "WHEN (InstType = 1) THEN 'Bank' "
+ "WHEN (InstType = 2) THEN 'Subdivision' "
+ "END"
)
@Table(schema = "dbo", name = "tInstit")
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class FaInstit
你的 classes FaInstit
(<--Extends) FaClient
(<-- Extends) FaIndividual
都被注释 @Entity
这意味着这些是持久性 classes,它们的字段映射到 DB tables/columns.
在您的超级 class FaInstit
中,您指定继承层次结构中的所有实体都将共享相同的主 table - dbo.tInstit
– 与注释 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
当对所有实体使用单个 table 时,您需要将 table 中的每条记录标识为属于 class 中的一个或另一个。这是通过 @DiscriminatorColumn
完成的(如果您跳过此注释,将选择默认列名)。 DiscriminatorColumn 中的值可以使用 @DiscriminatorValue
注释指定。因此,每当您坚持使用 FaIndividual
时,DiscriminatorColumn 中的值将是 Individual.
有时我们需要一个实体映射到多个 table。您示例中的主要 table 是 dbo.tInstit
,但我们可以使用 @SecondaryTable
注释定义任意数量的次要 table。您已在 FaIndividual
中完成此操作,您应该在 class 的定义(未显示)中看到 class 的字段映射到 table 中的任何一个。 secondarytable使用的行由@SecondaryTable
属性中的join信息定义;
pkJoinColumns = {@PrimaryKeyJoinColumn(name = "InstitID")}
所以我们有一个连接 where dbo.tInstit.ID = dbo.tAttr.InstitID
,JPA 将 update/read 根据这个连接信息等跨越两个 table 的实体字段。
您已声明
I don't want documentation
但恐怕这正是您所需要的,因为这里有很多东西要学。我建议挖掘一些 tutorials/examples 涵盖这种领域。
我希望这能让你继续下去。