Ake*_*dee 8 validation grails hibernate spring-security grails-orm
当我在域类中映射自定义标识属性时,为什么hibernate会检查唯一约束?当我更新对象时,尽管发布的字段值与存储在DB中的值相同,但验证失败!即使我没有对表单进行任何更改(确保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
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我创建具有最小属性集的用户时,会创建一条记录.但是当我尝试更新相同的对象时:def user = User.findByUsername('akeel')user.lastLoginDate = new Date()user.save(flush:true)没有任何反应,因为唯一的验证检查失败.我可以通过执行user.save来绕过验证(validate:false,flush:true)但是,这不是一个选项,因为我需要在用户添加时验证zipCode.
我必须将自定义标识列profileId的约束设置为nullable true,以解决此处建议的"映射中的重复列"问题.
这个问题与这里讨论的问题完全一样,但提出的解决方案对我不起作用.
我正在使用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']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |