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

休眠:复合PK与代理PK中的观点

冯沛
2023-03-14
问题内容

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

  1. 有不止一种业务-价值-行业组合成为唯一的PK
  2. 组合pk值在表详细信息中重复
  3. 无法更改该复合PK内的业务价值

我知道hibernate可以支持这两种类型的PK,但是我以前与有经验的同事聊天时感到很奇怪,他们说复合PK在执行复杂的SQL查询和存储过程时更容易处理。

他们继续说,使用代理密钥在进行联接时会使事情复杂化,并且在几种情况下,使用代理密钥不可能做一些事情。虽然很抱歉,我无法在这里解释细节,因为当他们解释时我还不够清楚。也许我下次再讲更多细节。

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

@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



 类似资料:
  • 问题内容: 据我了解,每当我在JPA / Hibernate实体内的Long字段上使用@Id和@GeneratedValue时,我实际上是在使用代理键,考虑到我的非母语,这是定义主键的一种非常不错的方法- 使用复合主键的良好经验,其中: 有不止一种业务-价值-行业组合成为唯一的PK 组合pk值在表详细信息中重复 无法更改该复合PK内的业务价值 我知道休眠可以支持两种类型的PK,但是我以前与有经验的

  • 问题内容: 我在Oracle数据库中有旧表,我想使用Hibernate从Java应用程序访问它。问题是:表没有好的主键。例如,一个表如下所示: 最初的设计师决定使用该列作为状态字段,认为数据库永远不需要区分公司外部的John Smiths,而是可以通过他们的hired_at日期来识别具有相同名称的员工。显然,这将创建一个部分可为空且可修改的主键。由于数据库不允许将此作为​​主键,因此他使用了唯一索

  • 问题内容: 我们有三个按地区物理隔离的数据库,其中一个位于洛杉矶,旧金山和纽约。所有数据库共享相同的架构,但包含特定于其区域的数据。我们正在寻求将这些数据库合并为一个数据库并进行镜像。我们需要保留每个区域的数据,但是将它们合并到一个数据库中。这给我们带来了很多问题,例如,我们肯定会有重复的主键,而外键可能是无效的。 我希望找到一个对这样的任务有经验的人,他可以提供一些技巧,策略和经验,以帮助我们完

  • 假设我有这些表: 表A在两个字段上有一个复合主键: 员工ID(字符串) 表B也有一个复合主键,但在三个字段上: 员工ID(字符串) 交易ID(Long) 日期(Date) 在表B中,员工ID和事务ID上有一个外键,称为“FK1”(为简单起见)。 由于表A中使用的复合id用于多个映射的Hibernate类,因此我创建了一个可以重用的类: 因此,映射到表A的类如下所示: 映射到表B的类如下所示: 显然

  • 我正在尝试将下表映射到JPA中。user_tax和税收以及user_tax和用户之间的关系是一对多的。它使我感到困惑,因为我有一个复合主键,我需要将外键映射到这2个键。 错误消息:< code > org . hibernate . annotation exception:mapped by引用未知的目标实体属性:entity。实体中的Tax.user_tax。UserTax.taxs 这是我的

  • 问题内容: 是否可以创建一个不包含主键/ Id 的表(从带有JPA注释的Hibernate中)? 我知道这不是一个好主意。一个表应该有一个主键。 问题答案: 我发现这样做是不可能的。对于使用旧系统的人来说真是太不幸了。 如果您进行逆向工程(从现有的JDBC连接创建带有JPA注释的实体),则该表将创建两个Java类,一个为Entity,一个为字段;ID,以及一个可嵌入的ID,其中包含关系中的所有列。