【发布时间】:2011-06-02 10:35:53
【问题描述】:
据我了解,每当我在 JPA/Hibernate 实体内的 Long 字段上使用 @Id 和 @GeneratedValue 时,我实际上是在使用代理键,我认为这是定义主键的一种非常好的方法我在使用复合主键方面不太好的经验,其中:
- 有超过 1 个业务价值列组合成为唯一的 PK
- 复合 pk 值在表详细信息中重复
- 无法更改复合 PK 中的业务价值
我知道 hibernate 可以支持这两种类型的 PK,但是我之前与有经验的同事的聊天让我感到疑惑,他们说复合 PK 在执行复杂的 SQL 查询和存储过程过程时更容易处理。
他们继续说,当使用代理键时,在加入时会使事情复杂化,并且在使用代理键时不可能做一些事情的情况有多种。虽然我很抱歉我不能在这里解释细节,因为他们解释的时候我不够清楚。也许下次我会提供更多细节。
我目前正在尝试做一个项目,并想尝试代理键,因为它不会跨表重复,我们可以更改业务列的值。而当需要一些商业价值组合的独特性时,我可以使用类似的东西:
@Table(name="MY_TABLE", uniqueConstraints={
@UniqueConstraint(columnNames={"FIRST_NAME", "LAST_NAME"}) // name + lastName combination must be unique
但由于之前关于复合键的讨论,我仍然存在疑问。
你能分享你在这件事上的经验吗?谢谢!
【问题讨论】:
标签: java database hibernate database-design