Hibernate:复合 PK 与代理 PK 的观点

2023-12-12

据我了解,每当我在 JPA/Hibernate 实体内的 Long 字段上使用 @Id 和 @GenerateValue 时,我实际上是在使用代理键,并且我认为这是定义主键的一种非常好的方法,考虑到我的不-使用复合主键的良好体验,其中:

  1. 超过1个商业价值栏组合成为独特的PK
  2. 复合 pk 值在表详细信息中重复
  3. 无法更改该复合 PK 内的业务价值

我知道 hibernate 可以支持这两种类型的 PK,但我之前与经验丰富的同事聊天时留下了疑问,他们说在执行复杂的 SQL 查询和存储过程过程时,复合 PK 更容易处理。

他们继续说,使用代理键会使连接时的事情变得复杂,并且在使用代理键时无法执行某些操作时存在多种情况。虽然很抱歉我无法在这里解释细节,因为他们解释时我不够清楚。也许下次我会提供更多细节。

我目前正在尝试做一个项目,并且想要尝试代理键,因为它不会在表之间重复,并且我们可以更改业务列值。当需要某些业务价值组合的独特性时,我可以使用类似的东西:

@Table(name="MY_TABLE", uniqueConstraints={
    @UniqueConstraint(columnNames={"FIRST_NAME", "LAST_NAME"}) // name + lastName combination must be unique

但由于之前关于组合键的讨论,我仍然存有疑问。

您能分享一下您在这方面的经验吗?谢谢 !


关于任何应用程序的第一条规则是需求会发生变化。时期。因此,今天看起来很适合 PK 的东西明天可能就根本不是 PK 了。

如果某个值包含以下特征,则它是 PK 的良好候选者:

  1. 它是一成不变的。它永远不会改变。
  2. 独特性。两条记录永远不会共享相同的 ID。

也就是说,在现实世界中几乎不可能有任何东西永久地具有这些特征。我的意思是,即使某些东西今天是一成不变且独一无二的,但这并不意味着它会永远如此。

因此,尽可能使用代理键。仅对旧数据库使用自然键。远离那些建议自然键比代理更好的朋友(开玩笑):-)

当然:您可以使用数据库中的约束强制执行唯一性规则(就像在示例中所做的那样),从而使两条记录不可能共享相同的值(如果这是业务规则)。当将来业务逻辑发生变化时,您会很高兴看到您使用了代理键;-)

但不要相信 stackoverflow 上随机的家伙会这么做。阅读维基百科上的这两篇文章:

http://en.wikipedia.org/wiki/Surrogate_key

http://en.wikipedia.org/wiki/Natural_key

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

Hibernate:复合 PK 与代理 PK 的观点 的相关文章

  • 如何在数据库中存储年月?

    是否有在数据库中存储年份和月份的标准方法 我需要根据月份和年份制作一些报告 我无法使用日期和函数实时提取月份 因为表很大 所以我需要预处理 我会和 Michael 的建议是什么 https stackoverflow com a 81694
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序

随机推荐

  • x86 函数调用类型

    我是x86新手 我的问题是关于函数调用 据我所知 有三种函数调用类型 短调用 0xe8 远调用 0x9a 和近调用 0x 有些将短调用称为相对调用 ip arg cs inv 将远调用称为绝对调用 ip arg cs arg 但近调用又如何
  • 如何使用外部库 JAR 在终端中运行 Java 程序

    这应该很简单 但我以前从未这样做过 也没有找到任何解决方案 我目前正在使用 Eclipse 来编写我的程序 它导入一些外部 JAR 库 例如 google data api 库 我可以使用 Eclipse 来编译 构建 运行该程序 但现在我
  • 在表中打印查询结果

    如果我有一个名为 info 的 MySQL 表 如下所述 并且我想打印出一个 HTML 表 如下所述 我该怎么做 MySQL表中的字段 id subject category actions date status HTML 表格结构 两列
  • 从生成的表中检索数据时对象名称“dbo.TableName”无效

    我首先使用实体 框架代码来创建我的表 请注意 创建表 而不是数据库 因为我正在托管环境中工作 并且没有允许创建数据库的用户 提交数据库更新工作正常 但检索数据会出现异常 异常详细信息 System Data SqlClient SqlExc
  • 无法使用 SMO 枚举 SQL Server 2008 注册服务器

    我的工作站上安装了 SQL Server 2005 Management Studio 此后我安装了 SQL Server 2008 工作站工具并删除了 SQL Server 2005 工具 我现在正在编写一个 C 程序 它会迭代我在 Ma
  • Javascript removeEventListener 不起作用 - 事件侦听器仍然存在

    我已经研究了一些解决这个问题的方法 但我不能真正告诉 我的代码是 lb document body if lb addEventListener lb addEventListener keyup function event keyPre
  • 在文本后添加格式化符号,保留预先存在的文本的字符格式

    我想在单元格中的现有文本后插入红色勾号 或向下箭头 如何插入字符和retain单元格中预先存在的字符格式 我只对这些单元格内的一些单词进行粗体 下划线或着色 通常建议的代码将原始单元格内容的所有自定义字符格式恢复为单元格字体格式 Activ
  • 查找字符串中搜索词的所有索引

    我需要一种快速方法来查找字符串中可能出现的搜索词的所有索引 我尝试过这种 蛮力 String扩展方法 Note makes use of ExSwift extension String var length Int return coun
  • 如何向使用点阵制作的水平图添加线条(abline 不知何故不起作用)?

    我想在水平图上绘制水平线和垂直线 对应于从 74 到 76 的 x 值和从 28 到 32 的 y 值 下面是我的 R 代码 但是当我运行以下命令时 我得到了水平图 但没有线条 我也没有收到来自 R 的错误 我安装的默认主题是将值映射为粉色
  • 单实例批处理文件?

    dostuff bat echo off insert long running process call here End 如果该批处理文件在执行时已经在另一个进程中运行 我可以向该批处理文件添加什么以使其终止 好吧 如果只能有一个实例
  • 需要在单个事务中将数据存储在 SqlAzure 和表存储中。

    我的应用程序有一个场景吗 我需要将历史数据存储在表存储中 将主要数据存储在 Sql Azure 中 即 如果数据发生更新 历史数据应移动到 Azure 表存储 并且新修改的数据应在单个事务中在 Sql Azure 中更新 如果任何一个数据库
  • 与 PHP 共享 Laravel 身份验证/会话

    我正在尝试将 Laravel 身份验证与许多简单的 HTML Javascript 应用程序一起使用 我认为理想的工作方式是这样的 用户访问简单的 HTML 应用程序 这个简单的 HTML 应用程序包含一个 PHP 文件 该文件检查是否 用
  • 如何使用 pack 将一个小部件放在并排的小部件下方?

    我尝试像这样放置小部件 我不明白为什么我的代码不这样做 试图在网上寻找示例 但没有找到解决方案 而且我尝试的任何方法都没有让我更接近所请求的结果 到目前为止 这是我的代码 如果您对代码中的任何内容有任何评论 请随时告诉我 因为这是我第一次尝
  • 从 PAT 部分 (MPEG-TS) 读取信息

    我正在编写一个 MPEG TS 文件解析器 但我一直坚持从 PAT 部分获取 program numbers 和 PID 我正在使用数据包分析器来比较我的结果 例如 这是一个 PAT 数据包 47 40 00 16 00 00 B0 31
  • 返回非静态本地对象时选择复制构造函数而不是移动构造函数

    我曾经假设类的移动构造函数将优先于其复制构造函数 但在下面的代码中 即使对象应该是可移动的 似乎也会选择复制构造函数 你知道为什么下面的代码选择复制构造函数吗foo 回报vector b B include b
  • 如何有条件地启用或禁用 Spring 中的计划作业?

    我在 Spring 中使用 cron 样式模式定义计划作业 使用 Scheduled注解 cron 模式存储在配置属性文件中 实际上有两个属性文件 一个是默认配置 另一个是依赖于环境的配置文件配置 例如开发 测试 产品客户 1 产品客户 2
  • 列出具有完全限定名称的所有子类

    我想获取给定类的所有子类及其完全限定名称的列表 我想从 Eclipse 复制它并粘贴到文本文件中 如下所示 some package Class1 some package Class2 some other package Class3
  • npm 未安装始终返回错误

    我试图安装这个 搜索 git whodotheyserve com 但这个错误始终出现 无论我尝试什么 我尝试过安装其他版本的 npm 但 npm测试 出现错误 npm 运行脚本任务 也返回错误 这种情况始终如一地发生 此外 我正在遵循该项
  • PDO值增量PHP,Mysql [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 大家好 我正在开发一个用于处理活动现场的项目 我正在尝
  • Hibernate:复合 PK 与代理 PK 的观点

    据我了解 每当我在 JPA Hibernate 实体内的 Long 字段上使用 Id 和 GenerateValue 时 我实际上是在使用代理键 并且我认为这是定义主键的一种非常好的方法 考虑到我的不 使用复合主键的良好体验 其中 超过1个