GORM id分配给另一个域类

时间:2016-07-26 11:03:01

标签: hibernate grails gorm

我有一个User类,我想创建一个名为UserSettings的新类。 UserSettings类应包含用户ID,该用户ID也应该是其自身的ID。

UserSettings看起来像这样:

class UserSettings {
    String listDefaultTimePeriod = "today"
    User user
    static mapping = {

        id generator: 'assigned', name: 'user'
        user column: 'user_id'

    }
}

如果我启动项目,我会收到此错误:

Caused by: org.hibernate.MappingException: Could not determine type for: User, at table: user_settings, for columns: [org.hibernate.mapping.Column(user_id)]

如何正确映射UserSettings以将user_id用作主键?

2 个答案:

答案 0 :(得分:1)

我认为我没有正确理解你...(并且因为一对一的关联而在同一个问题上绊倒了......)

要使“UserSettings类应包含用户ID,该用户ID也应该是其自身的ID。”我找到了以下解决方案(用于一对一关联):

class User {
    String name

    static hasOne = [setting: UserSetting]

    static mapping = {
        id column: 'user_id'
        setting cascade: 'all-delete-orphan'
    }

    static constraints = {
        setting unique: true
    }
}

class UserSetting {

    static belongsTo = [user: User]

    String listDefaultTimePeriod = "today"

    static mapping = {
        id column: 'user_id', generator: 'foreign', params: [property: 'user']
        user insertable: false, updateable: false
    }

}

“外来”生成器的hibernate文档的链接: hibernate generators

我发现的博客帖子的链接,描述了这个解决方案: Grails foreign id generator

答案 1 :(得分:0)

如果您拥有从UserSetting到User的关系,则用户的ID在数据库中自动被称为“user_id”。

我会按以下方式设计类: (请记住,并非每个数据库都允许您为表'用户'命名...)

class User {

    String name

    static hasMany = [settings: UserSetting]

}

class UserSetting {

    static belongsTo = [user: User]

    String listDefaultTimePeriod = "today"

    static mapping = {
        table 'user_settings'
        id generator: 'assigned'
    }

}

在控制器保存方法中,您必须将user_id填充到user_settings_id,如:

@Transactional
def save(UserSetting userSettingInstance) {
    ...
    userSettingsInstance.id = userSettingsInstance.user.id
    ...
}

- 我更喜欢将类命名为SingleInstance,数据库人员更喜欢将表命名为multiple ...(这就是表映射的原因)。