1

我在尝试更新 Grails 2.3.7 项目的记录时遇到问题

我不想修改属于复合 ID 的字段,我只想更新其他字段。

只有一个类,几个属性,但是每次我尝试更新时,当这行运行时,它都会向我抛出“非唯一错误”:

personInstance.validate()
if (personInstance.hasErrors()) {
    respond personInstance.errors, view:'create'
    return
}

我的课看起来像这样:

    class Person implements Serializable {

    static constraints = {
        name(unique: lastName)
    }

    static mapping = {
        id generator: 'assigned'
        id composite: ["name", "lastName"]
    }

    //Override equals and hashcode methods
    boolean equals(other) {
    if (!(other instanceof Person)) {
        return false
    }

        other.name == name && other.lastName == lastName
    }
    int hashCode() {
        def builder = new HashCodeBuilder()
        builder.append name
        builder.append lastName
        builder.toHashCode()
    }

    String name
    String lastName
    String description
}

和控制器动作:

def update() {
   def personInstance = Person.get(new Person(name:params.name, lastName:params.lastName))
   personInstance.properties = params

   personInstance.validate()
   if (personInstance.hasErrors()) {
      respond personInstance.errors, view:'create'
      return
   }

   personInstance.save flush:true

   request.withFormat {/*etc...*/}

}

当我使用 validate() 时,它会抛出一个 Grails 唯一键错误,当我避免验证它是一个 BD 非唯一 PK 错误。就像 Grails 在我 personInstance.validate() 时不知道我是要插入还是更新。

有没有办法以我没有看到的正确方式管理这个?还是我被迫避免验证?难道我做错了什么?

提前致谢。

4

1 回答 1

0

我相信 GORM 映射 DSL 只需要一个id定义。尝试将您的两id行合并为这一行:

id generator: 'assigned', composite: ["name", "lastName"]

此外,除了实现之外Serializable,您的域类还应覆盖equalsand hashCode,如此处“复合主键”中所述:http: //grails.org/doc/latest/guide/single.html#identity

于 2014-11-14T23:47:14.173 回答