这是从休眠官方教程 :
有一种替代
<composite-id>
声明允许与复合键访问遗留数据。 它的使用是严格禁止的其他任何东西。
组合键为什么不鼓励? 我使用的是3列的表格,所有列的外键,并一起形成一个主键是在我的模型建立有意义的关系考虑。 我不明白为什么这是一个坏主意,espicially,我将使用他们的索引。
有什么办法呢? 创建一个额外的自动生成的柱,并使用它作为主键? 我还需要查询反正我3列!?
总之,为什么这种说法是真的吗? 什么是更好的选择吗?
这是从休眠官方教程 :
有一种替代
<composite-id>
声明允许与复合键访问遗留数据。 它的使用是严格禁止的其他任何东西。
组合键为什么不鼓励? 我使用的是3列的表格,所有列的外键,并一起形成一个主键是在我的模型建立有意义的关系考虑。 我不明白为什么这是一个坏主意,espicially,我将使用他们的索引。
有什么办法呢? 创建一个额外的自动生成的柱,并使用它作为主键? 我还需要查询反正我3列!?
总之,为什么这种说法是真的吗? 什么是更好的选择吗?
他们劝阻他们有以下几个原因:
另一种方法是有一个单一的柱,自动生成的主键,除了其他三列。 如果你想三列的元组独特的,然后使用一个唯一约束。
即使是 - 也许 - 来不及回答你的问题,我想在这里给就需要另一个角度来看(较温和的希望)(难道真是一个提醒?)的Hibernate使用代理键。
首先 ,我想成为这样的事实, 既代理键(人工自动生成的)和自然键(与域名含义列(S)组成) 各有 利弊清晰。 我不是说,一点键式是优于其他。 我想说,根据您的要求,自然键可能比那些替代品,反之亦然一个更好的选择。
代理键:
如Hibernate参考Java Persistence中指出:
经验更丰富的Hibernate的用户使用saveOrUpdate()方法专门; 它更容易让Hibernate自行决定什么是新的,什么是旧的,尤其是在混合状态对象的更复杂的网络。 独家saveOrUpdate()方法的唯一(不算严重),缺点是有时无法猜测的一个实例是否兵不血刃一个SELECT在数据库 - 例如,当一个类被映射与自然的复合键和旧的或新没有版本或者时间戳属性。
限制的一些表现(这是怎么样,我想,我们应该称呼它),可以发现在这里 。
请不要太平方你的意见。 使用自然键时,它是相关的这样做,使用代理键时,它是更好地使用它们。
希望这个帮助别人!
我会从设计角度考虑问题。 这不只是如果休眠认为他们好还是坏。 真正的问题是: 是自然键很好的候选人是好的标识符我的数据?
在你的商业模式,今天,它可以方便的通过一些数据来确定一条记录,而是商业模式演进的时间。 当这些发生时,你会发现你的自然键不适合了唯一标识您的数据。 并与其他表参照完整性,这将使事情更难改变。
有一个替代的PK是方便,因为它没有链接你的数据在存储与识别 你的商业模式结构 。
自然键不能从一个序列生成的,并且不能由它的数据中识别数据的情况下是更加频繁。 这是一个证据表明,自然键从存储密钥不同,它们不能被视为一般的(和好)的办法。
使用代理键简化了应用程序和数据库的设计。 他们更容易使用,更高性能,并且做得很完美。
自然键带来的只是缺点:我想不出一个单一的优势,利用自然键。
这么说,我觉得休眠与自然的(组成)键没有真正的问题。 但是,你可能会发现一些问题(或错误)有时,和问题与文件或者试图得到帮助,因为休眠社会的广泛承认代理键的好处。 因此,准备你为什么选择复合键一个很好的答案。
如果Hibernate文档被正确的理解:
“还有一个另外的<composite-id>
允许访问遗留数据复合主键声明。它的使用是严格禁止的其他任何东西。”
在主题5.1.4。 ID标签的XML <id>
这使得太快我们可以得出结论,休眠文件不鼓励使用所取得的主键映射<composite-id>
而不是<id>
XML标记为复合主键映射和NOT作出任何参考负使用复合主键。
与数据库作为一种工具开发的应用程序肯定是更有利于保持对代理键的工作流程,使用群集索引查询优化。
特殊照顾并不需要但数据仓库和OLAP风格系统,利用一个巨大的事实表,以配合尺寸的代理键一起进行。 在这种情况下,数据指示可以用来保持记录的仪表板/应用程序。
因此,而不是一个方法是优于另一种,也许它是一个指令是有利的,另外,重点建设:你会不会很容易开发一个Hibernate应用程序能够利用到SSAS系统实例的直接访问。
我开发使用这两个按键混合物,感觉实现了坚实的星形或雪花的图案与聚簇索引的替代品通常是我的第一选择。
所以,到了OP的问候和其他寻求通过:如果你想留分贝不变的开发(其休眠专业) - 利用替代方法,并在数据读取趋于缓慢,或者你发现某些查询沥干性能,恢复到特定的数据库,并添加复合,聚集索引是优化查询顺序。