@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不允许Id
在OneToOne
或上使用ManyToOne
。在JPA
1.0中,您必须使用外键列PrimaryKeyJoinColumn
并Basic
Id
为其定义一个映射。
现在的问题是:@Id + @JoinColumn与@PrimaryKeyJoinColumn是否相同?
您可以获得类似的结果,但是使用Id
on OneToOne
或ManyToOne
则 简单得多 ,这是使用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的一部分。
为了记录在案,支持Id
上OneToOne
和ManyToOne
已经在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