当我在域类中映射自定义身份属性时,为什么 hibernate 要检查唯一约束?当我更新对象时,尽管发布的字段值与数据库中存储的值相同,但验证失败!即使我没有对表单进行任何更改(确保 dirty: false 并且没有属性绑定错误),也会发生这种情况。
我有一个 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 = new Date()
用户.保存(刷新:true)
什么也没有发生,因为唯一验证检查失败。我可以通过这样做绕过验证
user.save(验证: false, 刷新: true)
但是,这不是一个选项,因为每当用户添加邮政编码时我都需要验证它。
我必须将自定义标识列 profileId 的约束设置为可为空 true,以按照建议解决“映射中的重复列”问题here https://stackoverflow.com/questions/4457727/how-to-solve-grails-error-repeated-column-in-mapping-for-entity-on-existing-pos#comment5139677_4654921.
这个问题和讨论的一模一样here http://grails.1312388.n4.nabble.com/Why-is-uniquely-constrained-field-failing-on-update-td3731538.html,但提出的解决方案对我不起作用。
我正在使用 grails 2.1.2,如果需要其他任何信息来理解该问题,请告诉我。