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

为什么不建议在休眠状态下使用复合键?

戚哲
2023-03-14
问题内容

这是来自Hibernate的官方教程:

还有一个替代<composite-id>声明,该声明允许使用组合键访问旧数据。强烈建议不要将其用于其他任何用途。

为什么不鼓励使用复合键?我正在考虑使用一个三列表,其中所有列都是外键,并且一起形成一个主键,这在我的模型中是有意义的关系。我不明白为什么这是一个坏主意,特别是我将在它们上使用索引。

有什么选择?创建一个额外的自动生成的列并将其用作主键?无论如何,我仍然需要查询我的3列!

简而言之,为什么这句话是正确的?还有什么更好的选择?


问题答案:

他们由于以下几个原因而劝阻他们:

  • 使用起来很麻烦。每次您需要引用一个对象(或行)时,例如在Web应用程序中,例如,您都需要传递3个参数,而不仅仅是一个。
  • 他们效率低下。数据库不仅需要哈希一个整数,还需要哈希一个三列的复合哈希。
  • 它们导致错误:开发人员不可避免地会错误地实现主键类的equals和hashCode方法。或者它们使它可变,并一旦存储在HashSet或HashMap中就修改其值
  • 他们污染了架构。如果另一个表需要引用此3列表,则它将需要3列,而不只是3列作为外键。现在,假设您采用相同的设计,并且将此3列外键作为此新表的主键的一部分,您将很快拥有4列主键,然后在下一个表中具有5列PK,依此类推等等,导致数据重复和模式变脏。

替代方法是,除其他三列外,还具有一个单列的自动生成的主键。如果要使三列的元组唯一,请使用唯一约束。



 类似资料:
  • 问题内容: 这是来自Hibernate的官方教程: 还有一个替代声明,该声明允许使用组合键访问旧数据。强烈建议不要将其用于其他任何用途。 为什么不鼓励使用复合键?我正在考虑使用一个三列表,其中所有列都是外键,并且一起形成一个主键,这在我的模型中是有意义的关系。我不明白为什么这是一个坏主意,特别是我将在它们上使用索引。 有什么选择?创建一个额外的自动生成的列并将其用作主键?无论如何,我仍然需要查询我

  • 问题内容: 我需要在hibernate状态下禁用ONLY_FULL_GROUP_BY。这是我当前的会话工厂。我不确定如何在其中指定sql_mode =’‘。 问题答案: 我认为您可以在JDBC连接字符串中进行设置,例如

  • 问题内容: 什么和何时在休眠状态下使用DiscriminatorValue注释的最佳方案是什么? 问题答案: 这两个链接帮助我最了解继承概念: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6 要了解

  • 问题内容: 我有一个复合主键的表,其中指的是实体 HolidayPackage 有 许多 到 一个 关系 HolidayPackageVariant 和 HolidayPackage 。 当我尝试在HolidayPackageVariant中进行复杂的PK映射时,出现以下错误: 最初的SessionFactory创建失败。 有人可以告诉我我在做什么错吗? 我的POJO如下所示: HolidayPa

  • 问题内容: 什么时候使用独立标准?使用分离标准而不是普通标准有什么好处? 谢谢! 问题答案: 根据文档 一些应用程序需要在“分离模式”下创建条件查询,在该模式下,Hibernate会话不可用。此类可以在任何地方实例化,然后可以通过将会话传递到来获得一个Criteria 。所有方法都具有与Criteria接口的相应方法相同的语义和行为。

  • 问题内容: 我想在 Hibernate中 执行以下查询吗? 问题答案: 假设您的表是由一个类和实例变量映射的。然后,您将执行以下操作: 它应该返回您要寻找的结果。您只需要使名称适应您的类和参数名称即可。