2015-07-28 23 views
0

我试图创建一个SecUser域对象,其中包含一组UserGroup对象。每个UserGroup应该有一个SecUser类型的创建者。 A UserGroup也包含SecUsers(例如,创作者在Facebook风格应用程序中的朋友集合)的集合。到目前为止,我有以下域类...Grails域错误:列“USER_GROUP_ID”不允许为NULL

class SecUser implements Serializable { 
    static constraints = { 
    .... 
    usergroups nullable: true 
    } 
    static mapping = { 
    ... 
    usergroups cascade: 'all-delete-orphan' 
    } 
    static hasMany = [ 
    ... 
    usergroups: UserGroup 
    ] 
} 

class UserGroup { 
    SecUser creator; 
    static belongsTo = SecUser; 
    static hasMany = [ 
    members : SecUser 
    ] 
    static constraints = { 
    creator nullable: false 
    members nullable: true, maxSize: 100 
    } 
} 

Bootstrap.groovy我尝试创建像这样一些SecUserUserGroup对象...

def secuser = new SecUser(username: "username", password: "password"); 
def group1 = new UserGroup(title: "Friends", description: "friends"); 
def group3 = new UserGroup(title: "Colleagues", description: "colleagues"); 
secuser.addToUsergroups(group1); 
secuser.addToUsergroups(group2); 

但我发现了它说的错误...

ERROR spi.SqlExceptionHelper - NULL not allowed for column "USER_GROUP_ID"; SQL statement: 
insert into sec_user_usergroups (sec_user_id, creator_id) values (?, ?) [23502-176] 
Error | 
2015-07-28 11:04:49,208 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener - Error initializing the application: Hibernate operation: could not execute statement; SQL [n/a]; NULL not allowed for column "USER_GROUP_ID"; SQL statement: 
insert into sec_user_usergroups (sec_user_id, creator_id) values (?, ?) [23502-176]; nested exception is org.h2.jdbc.JdbcSQLException: NULL not allowed for column "USER_GROUP_ID"; SQL statement: 
insert into sec_user_usergroups (sec_user_id, creator_id) values (?, ?) [23502-176] 
Message: Hibernate operation: could not execute statement; SQL [n/a]; NULL not allowed for column "USER_GROUP_ID"; SQL statement: 
insert into sec_user_usergroups (sec_user_id, creator_id) values (?, ?) [23502-176]; nested exception is org.h2.jdbc.JdbcSQLException: NULL not allowed for column "USER_GROUP_ID"; SQL statement: 
insert into sec_user_usergroups (sec_user_id, creator_id) values (?, ?) [23502-176] 

我猜节目的告诉我,它无法完成addToUsergroups操作,因为UserGroup还没有得到一个id(因为它还没有保存)。但有没有办法可以让addToUsergroups操作在没有id的情况下完成? (因为如果没有SecUser,则不应创建UserGroup)。或者,我的域对象的设计有问题吗?

在此先感谢!

回答

0

我猜你在UserGroup表中的PK列被称为USER_GROUP_ID,如果这是你的所有代码,你不会说任何关于它的东西,并且你在数据库中有一个约束,它不允许你将它留空。因此,您必须更改您的UserGroup ID,指定您的PK列的调用方式不同。

class UserGroup { 
    SecUser creator; 
    static belongsTo = SecUser; 
    static hasMany = [ 
    members : SecUser 
    ] 

    static mapping = { 
    id column: 'user_group_id' 
    } 

    static constraints = { 
    creator nullable: false 
    members nullable: true, maxSize: 100 
    } 
} 

希望它有帮助。

+0

这不起作用,但我找到了两种方法来解决它。我可以从'UserGroup'中删除'SecUser creator'字段,它可以工作,或者离开'creator'字段并将'static mappedBy = [usergroups:“creator”]'添加到'SecUser'对象。不知道为什么修复它,但我必须更多地阅读GORM。 – CSharp

+0

另一件事,检查**静态belongsTo = SecUser **应该是** static belongsTo = [creator:SecUser] **而不是 – juandiegoh

+0

是的,这工作太juandiegoh,谢谢。在我做出更改之前,它不会工作,除非它是'static belongsTo = SecUser',但现在没关系。 – CSharp