Isa*_*aac 37 java database orm hibernate composite-key
这是来自Hibernate的官方教程:
还有一个替代
<composite-id>声明允许使用复合键访问旧数据.其他任何东西都强烈建议不要使用它.
为什么复合键不鼓励?我正在考虑使用一个3列表,其中所有列都是外键,并且一起形成一个主键,在我的模型中是一个有意义的关系.我不明白为什么这是一个坏主意,特别是我将使用它们的索引.
有什么选择?创建一个额外的自动生成列并将其用作主键?我仍然需要查询我的3列!?
简而言之,为什么这句话是真的?什么是更好的选择?
JB *_*zet 43
他们劝阻他们有以下几个原因:
另一种方法是除了其他三列之外,还有一个单列自动生成的主键.如果要使三列的元组唯一,则使用唯一约束.
mwn*_*iri 38
即使是 - 也许 - 回答你的问题为时已晚,我想在这里给出另一种观点(我希望更温和一点)Hibernate使用代理键的需要(这真的是建议吗?).
首先的,我想是这样的事实,明确双方的代理键(人工自动生成的)和自然键(与域名含义列(S)组成)有优点和缺点.我并不是说一个关键类型比另一个更好.我想说,根据您的要求,自然键可能是比代理更好的选择,反之亦然.
代理键是:
正如Java Persistence with Hibernate参考中所述:
更有经验的Hibernate用户只使用saveOrUpdate(); 让Hibernate决定什么是新的和什么是旧的更容易,特别是在具有混合状态的更复杂的对象网络中.独占saveOrUpdate()的唯一(不是真正严重的)缺点是,如果没有在数据库中触发SELECT,它有时无法猜测实例是旧的还是新的 - 例如,当使用自然复合键映射类时没有版本或时间戳属性.
可以在这里找到限制的一些表现形式(这是我认为应该如何调用它).
请不要对你的意见过于平庸.在与此相关时使用自然键,并在最好使用时使用代理键.
希望这有助于某人!
Lui*_*ano 10
我从设计的角度考虑问题.这不仅仅是因为Hibernate认为它们好坏.真正的问题是:自然键是否适合作为我的数据的良好标识符?
在您的业务模型中,今天可以方便地通过某些数据识别记录,但业务模型会及时发展.当发生这种情况时,您会发现您的自然键不再适合唯一标识您的数据.并与其他表参照完整性,这将使事情MUCH难以改变.
拥有代理PK非常方便,因为它不会将您的数据在您的存储中与您的业务模型结构相关联.
自然密钥不能从序列生成,并且数据无法通过其数据识别的情况更加频繁.这证明自然密钥与存储密钥不同,并且它们不能被视为一般(和良好)方法.
使用代理键简化了应用程序和数据库的设计.它们更易于使用,性能更高,并且可以完美地完成工作.
自然键带来的缺点是:我无法想到使用自然键的单一优势.
也就是说,我认为hibernate对自然(组合)键没有实际问题.但是你有时可能会发现一些问题(或错误),以及文档问题或试图获得帮助,因为hibernate社区广泛承认代理键的好处.因此,为您选择复合键的原因准备一个很好的答案.
| 归档时间: |
|
| 查看次数: |
18639 次 |
| 最近记录: |