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

标签 hibernate validation grails spring-security grails-orm

当我在域类中映射了自定义标识属性时,为什么 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/

相关文章:

java - Hibernate 标识符生成异常 : unrecognized id type : uuid-binary

jquery - 空输入返回 false 仅适用于一个输入,不适用于两个输入

javascript - onclick 函数的问题

java - JPA, hibernate : OneToOne mapping with foreign key only

java - Hibernate jpa子对象不保存

java - 当内容超过 141 个字符时,VARCHAR 列会安静地中断 Hibernate

php - 在 mvc php 中验证

javascript - 为什么我的 Javascript 验证不起作用?

grails - 如何从另一个 Grails 插件配置 Grails 插件

testing - 要测试多少 Grails GORM?