为什么在Grails中更新时唯一约束字段失败

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,让我知道是否需要其他任何东西来理解这个问题.

Pet*_*ook 4

主键的自定义属性名称似乎在 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)