在GORM中使用复合键

时间:2011-01-12 04:17:25

标签: hibernate grails gorm

grails document的第5.5.2.5节中说明了

  

GORM支持复合概念   标识符(标识符由   2个或更多属性)。它不是   我们推荐的方法,但是   如果您需要,可以使用

为什么不是个好主意?我有以下表格定义:

User (Table)
   Column: userId (Primary Key)

FriendMap
   Composite Key Column: userId (foreign key from User) and friendId

这是个坏主意吗?

3 个答案:

答案 0 :(得分:0)

对于用于多对多映射的连接表来说,这并不是一个想法,这就像你正在使用它一样。

有许多反对使用复合键而不是使用单个数字递增id字段的参数。它们主要涉及改变和重构您的域名变得更加复杂。

对于映射类,一个很好的例子就是针对spring-security-core插件的Burt mapping class between User and Role

答案 1 :(得分:0)

我看到了为什么不推荐它的证据。具有复合键的friendMap类也具有“version = false”。

在某些情况下,我得到了:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
        at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
        at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
        at org.codehaus.groovy.grails.orm.hibernate.events.PatchedDefaultFlushEventListener.performExecutions(PatchedDefaultFlush
EventListener.java:46)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)

我最近在删除FriendMap对象时看到了这个。这也不会一直发生。我在网上发现这可能是version = false和复合键的问题。我决定回到单个数字递增的id字段。从那以后,我没有看到任何问题。我不知道整个问题,但我不建议关闭版本控制的复合键。

答案 2 :(得分:-1)

我完全不同意这个人的Grails家伙。复合键可确保数据库的一致性,并且在许多情况下都需要具有正确规范化的数据库。

请参阅 http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

这是一个重要的基本数据库建模概念,我很惊讶它在grails中被掩盖了。