我有一个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用作主键?
答案 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 ...(这就是表映射的原因)。