分配给另一个域的 GORM id class

GORM id assigned to another domain class

我有一个 User Class,我想创建一个名为 UserSettings 的新 Class。 UserSettings class 应该包含用户 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 作为主键?

如果您有从 UserSetting 到 User 的关系,则在数据库中自动调用用户 ID 'user_id'。

我会按以下方式设计 classes: (请记住,并非每个数据库都允许您命名 table 'user'...)

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
    ...
}

- 我更喜欢将 class 命名为 SingleInstance,而数据库人员更喜欢将 table 命名为多个...(这就是 table 的原因映射)。

我想我没有正确理解你......(现在偶然发现了一对一关联的同一个问题......)

为了 "The UserSettings class should be contain the User ID which also should be the ID of itself." 我找到了以下解决方案(对于一对一关联):

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
    }

}

link "foreign" 生成器的休眠文档: hibernate generators

还有我发现的博客 post link,描述了这个解决方案: Grails foreign id generator