1

デフォルトの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 (例外が発生した後にセッションをフラッシュしないでください)

どんな助けでも大歓迎です。

情報: 新しい/変更されたクラスからサイズの制約を削除すると、保存は正常に行われます。

4

1 に答える 1