我有一个用户域,其中我对其员工编号
有唯一约束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是唯一的,但是在更新时我显然想要更新现有用户,但这种独特的约束阻止我这样做。关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
您收到此错误是因为您已将 employeeNumber 字段设为主键
对于Hibernate / Grails,Primary Key是对象的标识符值。这是在对象的生命中永远不会改变的东西
在更新期间,您尝试修改导致问题的标识符。
您绝对可以修改唯一字段,因此在您的情况下,您可以修改 employeeLogin 。但是您无法修改主键。
employeeNumber 也是主键,因此请勿将其声明为唯一键。这将删除您面临的唯一键错误。