gpt4 book ai didi

hibernate - 为什么在 Grails 中唯一受限的字段在更新时失败

转载 作者:行者123 更新时间:2023-12-04 08:35:12 25 4
gpt4 key购买 nike

当我在域类中映射了自定义标识属性时,为什么 hibernate 检查唯一约束?当我更新一个对象时,尽管发布的字段值与存储在数据库中的值相同,但验证失败!即使我没有更改表单(确保脏:false 并且没有属性绑定(bind)错误),也会发生这种情况。
我有一个 Grails 域类,如下所示:

class User {
Long profileId
String email
String username
String password
String title
String firstname
String lastname
String zipCode
Date lastLoginDate

static constraints = {
profileId nullable: true, blank: true
email blank: false, unique: true, email: true
username blank: false, unique: true
password blank: false
lastLoginDate nullable: true

firstname nullable: true
lastname nullable: true
zipCode nullable: true
}

static mapping = {
table 'USER_PROFILE'
id name:"profileId", column: "profile_id", generator: "sequence", params: [sequence:'userprofile_sequence']
version false
}

}

现在,当我创建具有最小属性集的用户时,会创建一条记录。但是当我尝试更新相同的对象时,例如:
def user = User.findByUsername('akeel')
user.lastLoginDate = 新日期()
user.save(刷新:真)
没有任何 react ,因为唯一验证检查失败。我可以通过做绕过验证
user.save(验证:假,刷新:真)
但是,这不是一个选项,因为每当用户添加它时,我都需要验证邮政编码。

我必须将自定义标识列 profileId 的约束设置为可为空的 true,以解决建议的“映射中的重复列”问题 here .

这个问题与讨论的 here 完全相同。 ,但提出的解决方案对我不起作用。

我正在使用 grails 2.1.2,如果需要其他任何东西来理解问题,请告诉我。

最佳答案

似乎主键的自定义属性名称在 Grails 中不起作用。我用 Grails 2.0.4、2.2.4 和 2.3.4 进行了测试,它们都无法识别 profileId作为主键。 User.get(1)工作正常,但 user.ident()返回 null .我肯定会在 Grails JIRA 中提出一个问题。

最简单的解决方案是删除 profileId属性,只需使用内置 id反而。然后只需删除 name:自定义映射的值。换句话说,你应该最终得到

id column: "profile_id", generator: "sequence", params: [sequence:'userprofile_sequence']

关于hibernate - 为什么在 Grails 中唯一受限的字段在更新时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21693847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com