grails - Grails以一对一关系创建客户端

标签 grails gorm one-to-one

我正在使用spring-security,并添加了一个额外的域-“UserSettings”,在创建用户时我将不会创建该域。

为了遵循所有原则,我决定在此处创建一对一关系。

用户域:

package com.trading.security

import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import com.trading.portal.UserSettings

@EqualsAndHashCode(includes='username')
@ToString(includes='username', includeNames=true, includePackage=false)
class User implements Serializable {

    private static final long serialVersionUID = 1

    transient springSecurityService

    String username
    String password
    boolean enabled = true
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    Set<Role> getAuthorities() {
        UserRole.findAllByUser(this)*.role
    }

    def beforeInsert() {
        encodePassword()
                us = new UserSettings(user:this,currency:'SEK', volumeUnit: 'AM3').save(failOnError:true)           
    }

        def afterInsert() {
        }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

        UserSettings getUserSettings() {
            us
        }

    protected void encodePassword() {
        password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password
    }

    static transients = ['springSecurityService']

    static constraints = {
        password blank: false, password: true
        username blank: false, unique: true
                us unique:true, nullable:true
    }

    static mapping = {
        password column: '`password`'
                table '`user`'
    }

        static hasOne = [us:UserSettings]
}

和UserSettings域:
 package com.trading.portal
import com.trading.security.User

class UserSettings {
    int id
    int SupplierId
    String supplierName
    String currency
    String volumeUnit

    static belongsTo = [user : User]
    static mapping = {
      id column: 'id', type: 'integer'  
    }

    static constraints = {
        user()
        supplierName()
        currency(inList: ['SEK', 'EUR', 'USD', 'GBP'])
        volumeUnit(inList: ['AM3', 'PKG', 'AM1', 'AM2'])

        supplierId      nullable:true
        currency        nullable:true
        volumeUnit      nullable:true
        supplierName    nullable:true

    }
}

因此,我尝试在插入之前先在用户域中创建用户设置,但失败并显示以下消息:
org.springframework.dao.InvalidDataAccessApiUsageException: 
Not-null property references a transient value - transient instance must be saved before current operation :
 com.trading.portal.UserSettings.user -> com.trading.security.User;
 nested exception is org.hibernate.TransientPropertyValueException: 
 Not-null property references a transient value - transient instance must be saved before current operation :
 com.trading.portal.UserSettings.user -> com.trading.security.User

我做错了什么?我该怎么解决?

最佳答案

UserSettings属于User,因此您必须先保存用户,然后在保存用户之前在User对象上调用beforeInsert

关于grails - Grails以一对一关系创建客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42670046/

相关文章:

grails - 如何用grails分页标记中的页码替换offset和max?

javascript - Grails 如何在 javascript 中获取用户名?

hibernate - 如何在不使用inList闭包的情况下使用GORM获取表B中不存在的表A行?

java - 使用共享主键(双向) hibernate @OneToOne。依赖实体未保留在数据库中。

grails - 的行为belongsTo

grails - Grails域名查询列表

grails - 自定义外键列名

java - 具有一对一关系外键约束的房间数据库失败错误

java - 如何创建一对一的单例关系

grails - 了解 Grails 中的单元测试