Grails docs阻止使用复合主键,但在this video(26:00 - 29:00)@BurtBeckwith使用复合主键时,他会谈到性能优势将连接表映射到域类而不是使用集合。这提出了几个问题:
hashcode
或equals
。答案 0 :(得分:3)
Hibernate更喜欢简单的主键,即使有一个自然的唯一键(例如User表中的用户名),因为自动递增long值更容易用作外键。它当然支持其他方法,GORM也是如此。
我在UserRole表中使用复合PK的原因是为了使它与在GORM中使用多对多时隐式创建的连接表保持一致。我提出的方法就数据库而言是相同的,但性能更高,并且您还可以更好地控制自定义连接表。但是随意将复合PK更改为两个外键(理想情况下具有唯一索引)并添加常规单列主键。只要您不打算将其用作GORM多对多连接表,这就没问题。
答案 1 :(得分:2)
我想我可以回答这些问题,但如果我错了,有人会纠正我。
复合键不是Grails不鼓励的。整体来说,桌面设计通常不鼓励。这样做的最大缺点是它使与其他表的关系更加复杂。它实际上与Grails没什么关系,而是与数据库设计有关。
我的猜测是因为没有任何东西引用UserRole表,所以它没有受到伤害。他本可以使用主键,然后在用户和角色之间创建一个唯一键,但由于没有其他域引用UserRole,为什么要添加不必要的字段。如果您未覆盖hashCode
或equals
,则无法比较域名。
是的,相同的规则适用于Grails 2,但Grails现在支持Bags。这将提供他在该演讲中概述的相同优点,而不会丢失当前Grails语法的Groovyness。这不是默认值,因此您必须指定。
将集合设置为Bag的代码:
Collection books
static hasMany = [books: Book]