Grials更新因唯一约束而失败

时间:2015-09-15 14:54:51

标签: validation grails constraints unique

我有一个用户域,其中我对其员工编号

有唯一约束
class User {

    Integer employeeNumber
    String employeeLogin
    String firstName
    String middleName
    String lastName
    String nickname
    Date birthday

    static mapping = {
        table 'user'
        id generator: 'assigned', name: 'employeeNumber', type: 'int'
        employeeNumber column: 'employee_number'
        version false
        sort 'lastName'
    }

    static constraints = {
        employeeNumber(blank: false, nullable: false, unique: true)
        employeeLogin(blank: false, nullable: false, unique: true)
        firstName(blank: false, nullable: false)
        middleName(blank: true, nullable: true)
        lastName(blank: false, nullable: false)
        nickname(blank: true, nullable: true)
        birthday(blank: true, nullable: true)
    }
}

我试图用

更新用户
class UserController {

    ...

    def saveUser() {

    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

        if (params.userId) { // handles user update for existing employeeNumber
            def user = User.findByEmployeeNumber(params.userId) // sent in hidden field name userId with value employeeNumber

            user.employeeNumber = Integer.parseInt(params.employeeNumber)
            user.employeeLogin = params.employeeLogin
            user.firstName = params.firstName
            user.middleName = params.middleName
            user.lastName = params.lastName
            user.nickname = params.nickname
            try {
                user.birthday = formatter.parse(params.birthday)
            } 
            catch (Exception ignore) {
                user.birthday = null
            }

            if (user.validate()) {
                user.save(flush:true, failOnError:true)
                redirect(action:'profile', id:user.employeeNumber)
            } else {
                render(view:'editUser', model:[user:user])
            }
        } else {  // handles new user
            ... // this part works
        }
    }

    ...

}

但由于if (user.validate()) { ... }employeeNumber的独特限制,它在employeeLogin上有所吸引力。

在创建新用户时,我希望用户名和ID是唯一的,但是在更新时我显然想要更新现有用户,但这种独特的约束阻止我这样做。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为您已将 employeeNumber 字段设为主键

对于Hibernate / Grails,Primary Key是对象的标识符值。这是在对象的生命中永远不会改变的东西

在更新期间,您尝试修改导致问题的标识符。

您绝对可以修改唯一字段,因此在您的情况下,您可以修改 employeeLogin 。但是您无法修改主键。

employeeNumber 也是主键,因此请勿将其声明为唯一键。这将删除您面临的唯一键错误。