当前位置: 首页 > 面试题库 >

JPA:@JoinColumn和@PrimaryKeyJoinColumn之间的区别?

锺离德庸
2023-03-14
问题内容

@JoinColumn和之间的确切区别是@PrimaryKeyJoinColumn什么?

您使用@JoinColumn的列是外键的一部分。典型的列可能看起来像(例如,在具有附加属性的联接表中):

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此我必须用标记@Id

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

现在的问题是:

@Id+ @JoinColumn上面一样@PrimaryKeyJoinColumn

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

如果没有,那@PrimaryKeyJoinColumn有什么用?


问题答案:

如果我也将列也提升为a / PK(又称为识别关系)会怎样?由于该列现在是PK,因此必须使用@Id(…)对其进行标记。

派生标识符的 增强支持实际上是JPA2.0中新内容的一部分(请参阅JPA 2.0规范中的 2.4.1与派生身份相对应的主键部分),JPA1.0不允许IdOneToOne或上使用ManyToOne。在JPA
1.0中,您必须使用外键列PrimaryKeyJoinColumnBasic Id为其定义一个映射。

现在的问题是:@Id + @JoinColumn与@PrimaryKeyJoinColumn是否相同?

您可以获得类似的结果,但是使用Idon OneToOneManyToOne简单得多 ,这是使用JPA
2.0映射派生标识符的首选方法。PrimaryKeyJoinColumn仍可以在 JOINED 继承策略中使用。在JPA
2.0规范的相关部分下面:

11.1.40 PrimaryKeyJoinColumn注释

PrimaryKeyJoinColumn批注指定用作外键加入到另一个表的主键列。

PrimaryKeyJoinColumn注释用于连接在一个实体子类的主表JOINED 映射策略到它的父类的主表; 它在
SecondaryTable注释中用于将辅助表连接到主表;并且可以OneToOne
在其中将引用实体的主键用作被引用实体的外键的映射中使用[108]。

如果PrimaryKeyJoinColumn 在JOINED映射策略中未为子类指定注释,则假定外键列的名称与超类主表的主键列的名称相同。

示例: Customer和ValuedCustomer子类

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }

[108] 对于OneToOne映射情况, 现在将首选2.4.1.1节中描述的派生id机制PrimaryKeyJoinColumn

也可以看看

  • 通过一对一关系的主键

此源http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/html" target="_blank">jpa-join-
table-additional-
state指出使用@ManyToOne和@Id可与JPA 1.x一起使用。现在谁是正确的?

作者使用的是与 JPA 2.0
兼容的预发行版EclipseLink(在撰写本文时为2.0.0-M7版)来撰写有关JPA
1.0(!)的文章。本文具有误导性,作者使用的 不是 JPA 1.0的一部分。

为了记录在案,支持IdOneToOneManyToOne已经在1.1的EclipseLink增加(见此消息来自詹姆斯·萨瑟兰,的EclipseLink
comitter和的主要贡献者的Java
Persistence维基书)。但是让我坚持,这
不是 JPA 1.0的一部分。



 类似资料:
  • 问题内容: 但没人回答我的下一个问题。经典的hibernate方法使用和JPA 实现之间有什么区别?我听说此JPA实现使用并像包装器一样工作,这是真的吗? 问题答案: 确实。 JPA只是一个API,允许您从使用的持久层中进行抽象。Hibernate提供了充当接口的实现,它使用与Hibernate 相同的基础方法。 这个想法是,例如,您可以将实现切换到Eclipse Link,而不必更改任何源代码。

  • 问题内容: 我对JPA中的LockModeTypes的工作感到困惑: 它在提交时增加版本。 这里的问题是:如果我的实体中有版本列,并且如果未指定此锁定模式,则它的工作方式也类似,那么它的用途是什么? 即使未更新实体,它也会在此处增加版本列。 但是,如果在提交此事务之前有任何其他进程在同一行中进行了更新,它的用途是什么?无论如何,该交易将失败。那么这个有什么用呢。 此锁定模式发出a (如果未指定提示

  • Spring-JPA和Spring-Data-JPA之间的区别,我不是指JPA规范。 我是JPA和Spring的新手。 在将Hibernate与Spring集成为JPA提供程序时,我遇到了两个Spring项目。 请澄清一下 https://mvnrepository.com/artifact/org.springframework/spring-jpa之间的区别和关系 https://mvnrep

  • 问题内容: 根据Hibernate文档,如果我们要将Map用作实体之间的关联,则有多个注释可用。医生说: 或者,将映射键映射到一个或多个专用列。为了自定义映射,请使用以下注释之一: @MapKeyColumn(如果地图关键字是基本类型)。如果未指定列名,则使用属性名称,下划线和KEY(例如orders_KEY)。@MapKeyEnumerated / @MapKeyTemporal(如果地图键类型

  • 问题内容: 当我使用@Entity注释类并尝试解析依赖项时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有hibernate的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hib