デフォルトのh2データベースでgrails 2.0.3を使用しており、次のユーザードメインクラスがあります。
class User {
transient springSecurityService
String username
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
Preferences preferences
Company company
Personal personal
static constraints = {
username email: true, blank: false, unique: true
password blank: false
preferences unique: true
company unique: true
personal unique: true
}
static mapping = {
password column: '`password`'
}
Set<Role> getAuthorities() {
UserRole.findAllByUser(this).collect { it.role } as Set
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
protected void encodePassword() {
password = springSecurityService.encodePassword(password)
}
}
コントローラーでは、次のコードを使用してユーザーを保存します。
userInstance.save(flush: true)
さて、今日の午後、パスワード フィールドにはサイズの制約が必要であることに気付き、ドメイン クラスを次のように変更しました (変更は制約のみです)。
class User {
transient springSecurityService
String username
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
Preferences preferences
Company company
Personal personal
static constraints = {
username email: true, blank: false, unique: true
password blank: false, size: 6..15
preferences unique: true
company unique: true
personal unique: true
}
static mapping = {
password column: '`password`'
}
Set<Role> getAuthorities() {
UserRole.findAllByUser(this).collect { it.role } as Set
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
protected void encodePassword() {
password = springSecurityService.encodePassword(password)
}
}
その後、ビューとコントローラーを再度生成しました。コントローラーからユーザーオブジェクトを保存しようとすると、次を使用します。
userInstance.save(flush: true)
次の例外が発生します。
クラス: org.hibernate.AssertionFailure メッセージ: login.User エントリの ID が null (例外が発生した後にセッションをフラッシュしないでください)
どんな助けでも大歓迎です。
情報: 新しい/変更されたクラスからサイズの制約を削除すると、保存は正常に行われます。