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

2024-04-30

两者之间的确切区别是什么@JoinColumn and @PrimaryKeyJoinColumn?

You use @JoinColumn对于属于外键一部分的列。典型的列可能如下所示(例如,在具有附加属性的连接表中):

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

如果我也将该列提升为 PK(也称为识别关系),会发生什么情况?由于该列现在是 PK,我必须用@Id:

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

现在的问题是:

Are @Id + @JoinColumn和刚才一样@PrimaryKeyJoinColumn?:

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

如果不是,那是什么@PrimaryKeyJoinColumn那里有什么用?


如果我也将该列提升为 PK(也称为识别关系),会发生什么情况?由于该列现在是 PK,因此我必须使用 @Id (...) 对其进行标记。

这增强了对派生标识符实际上是JPA 2.0 中的新内容 https://stackoverflow.com/questions/2435253/a-concise-clear-list-of-what-is-new-in-jpa2/2440516#2440516(参见章节2.4.1 派生身份对应的主键在 JPA 2.0 规范中),JPA 1.0 不允许Id on a OneToOne or ManyToOne。使用 JPA 1.0,您必须使用PrimaryKeyJoinColumn并且还定义一个Basic Id外键列的映射。

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

您可以获得类似的结果,但使用Id on OneToOne or ManyToOne is 简单得多是使用 JPA 2.0 映射派生标识符的首选方法。PrimaryKeyJoinColumn可能仍会用于JOINED继承策略。 JPA 2.0 规范的相关部分如下:

11.1.40 PrimaryKeyJoinColumn注解

The PrimaryKeyJoinColumn注解 指定一个主键列 用作连接到的外键 另一张桌子。

The PrimaryKeyJoinColumn annotation is used to join the primary table of an entity subclass in the JOINED mapping strategy to the primary table of its superclass; it is used within a SecondaryTable annotation to join a secondary table to a primary table; and it may be used in a OneToOne mapping in which the primary key of the referencing entity is used as a foreign key to the referenced entity[108].

...

If no PrimaryKeyJoinColumn注解是为子类指定的 在 JOINED 映射策略中, 假设外键列 与主键同名 主表的列 超类。

...

Example:客户和尊贵客户子类

@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] The derived id mechanisms described in section 2.4.1.1 are now to be preferred over PrimaryKeyJoinColumn for the OneToOne mapping case.

See also

  • 通过一对一关系的主键 http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

这个来源http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state声明使用 @ManyToOne 和 @Id 适用于 JPA 1.x。现在谁是正确的?

作者使用的是预发行版JPA 2.0EclipseLink 的兼容版本(版本2.0.0-M7 http://kenai.com/projects/puj/sources/arena/revision/188在撰写本文时)写一篇有关 JPA 1.0(!)的文章。这篇文章有误导性,作者使用的是NOTJPA 1.0 的一部分。

作为记录,支持Id on OneToOne and ManyToOne已添加到 EclipseLink 1.1 中(请参阅 from 詹姆斯·萨瑟兰 http://wiki.eclipse.org/User:James.sutherland.oracle.com, EclipseLink 的提交者和主要贡献者Java持久化 http://en.wikibooks.org/wiki/Java_Persistence维基百科书)。但我要强调的是,这是NOTJPA 1.0 的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA:@JoinColumn 和 @PrimaryKeyJoinColumn 之间的区别? 的相关文章

随机推荐

  • 可以删除 .nupkg 文件吗?

    我是 NuGet 的新手 刚刚开始使用它并给自己买了一份 WatiN 的副本 我正在尝试缩小在将其放入版本控制之前撤回的文件夹的大小 我注意到 WatiN 2 0 50 nupkg 约为 12mb 我注意到从这个链接 http nuget
  • Spark 使用自定义架构读取镶木地板

    我正在尝试使用自定义架构导入镶木地板格式的数据 但它返回 类型错误 option 缺少 1 个必需的位置参数 值 ProductCustomSchema StructType StructField id sku IntegerType T
  • 消除启动时的安全警告

    打开任何 MS Access 数据库时 都会出现安全警告 指出该文件可能对计算机有害 但是 有没有办法删除此消息 或者它应该仍然是一种必要的罪恶 您也许可以签署您的程序 我不确定 读本文 http www howto outlook com
  • 使用 std::istream_iterator 限制 std::copy 的范围

    我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题 我在用着istream iterator读书floatss 或其他类型 来自 astd istream include
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • 在Matlab中将矩阵中的元素i,j设置为i*j

    我想生成一个矩阵 其中 i j 元素等于 i j 其中 i j e g 0 2 3 2 0 6 3 6 0 到目前为止 我已经发现我可以使用这个索引矩阵访问非对角线元素 idx 1 eye 3 但我还没有弄清楚如何将矩阵单元的索引合并到计算
  • 如何使用 Python 将表格从 CSV 写入 PDF [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个CSV文件包含下表 users passwords company Admin test psw test cmp test
  • 资源目录不可用

    Eclipse 在问题选项卡中显示资源目录不可用 尽管它在项目文件夹树中可用 2012 09 11 12 14 43 QR01 ERROR resource directory D workspaceQR QR01 res does not
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 在展开转场停止转场后显示警报。如何确保展开转场完成后显示警报?

    我有一个从 A 视图控制器到 B 视图控制器的展开序列 在B中完成了一次网络操作 操作完成后 响应将显示在A视图控制器中 我成功地制作了这个结构 然而有一个问题 当我尝试显示警报时 它会显示但会停止继续 我如何确保在 segue 完成后显示
  • c 中的帕斯卡三角形与递归函数

    您好 这是我用于计算帕斯卡三角形的代码 但它运行错误 已停止工作 为什么 我认为它的错误在于 paskal 函数 include
  • 如何获取有权访问bigquery中的表的所有用户/组/服务帐户

    from pprint import pprint from google oauth2 import service account import googleapiclient discovery credentials service
  • 是否可以使用 Google Docs API 插入水平规则?

    我一直在开发一个项目 需要使用 PHP 将文本和其他类型的元素插入 Google 文档文档中 我可以使用以下代码插入文本 requests requests new Google Service Docs Request insertTex
  • 简化债务加权有向图的算法

    我一直在使用我编写的一个小Python脚本来管理室友之间的债务 它有效 但缺少一些功能 其中之一是简化不必要的复杂债务结构 例如 如果下面的加权有向图代表一些人 箭头代表他们之间的债务 爱丽丝欠鲍勃 20 美元 查理欠 5 美元 鲍勃欠查理
  • 从Python中的一行中删除标签

    我有一个具有以下架构的文本 word1 word2 br word3 word4 br 我想删除最后一部分 并将我的结果存储在另一个文件中 我已尝试以下操作 仍然没有将结果保存在其他文件中 def main fileR open test
  • 如何解决webview内容重叠的问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 嗨 当背景设置为透明时 如何解决we
  • 变量范围的 Java 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以指导我查看 java 文档以了解变量的范围 我想查看 java 8 中的类变量和成员变量的
  • 如何使用 numpy 数组加速分形生成?

    这是我为使用牛顿方法制作分形而编写的一个小脚本 import numpy as np import matplotlib pyplot as plt f np poly1d 1 0 0 1 x 3 1 fp np polyder f def
  • 我可以在 Open Graph 中使用相对路径吗? [复制]

    这个问题在这里已经有答案了 我正在尝试设置相对路径og image元数据如下 在共享调试器时 我收到以下警告 推断属性 og image 属性应该明确 提供 即使可以从其他标签推断出值 有没有办法在Open Graph中使用相对路径 不 o
  • JPA:@JoinColumn 和 @PrimaryKeyJoinColumn 之间的区别?

    两者之间的确切区别是什么 JoinColumn and PrimaryKeyJoinColumn You use JoinColumn对于属于外键一部分的列 典型的列可能如下所示 例如 在具有附加属性的连接表中 ManyToOne Join