【问题标题】:Insert Grails Domain object with foreign key使用外键插入 Grails 域对象
【发布时间】:2015-08-14 23:07:53
【问题描述】:

我有两个域类:

class User {
Client client
String firstName
String lastName
String email
String password
String address
String city
String state
String zip
String phone
Integer active
Date changedate

static belongsTo = [client : Client]

static constraints = {
    firstName(nullable: false, blank:false)
    lastName(nullable: false, blank:false)
    email(nullable: false, blank: false)
    address(nullable:false,blank:false)
    city(nullable:false,blank:false)
    state(nullable:false,blank:false)
    zip(nullable:false,blank:false)
    phone(nullable:false,blank:false)
    active(nullable:false,blank:false)
    changedate(nullable:false,blank:false)
}

}

class Client {
String name
String webaddress
String address
String city
String state
String zip
String phone
Integer active
Date changedate

static constraints = {
    name(unique:true, nullable: false, blank:false)
    address(nullable:false,blank:false)
    city(nullable:false,blank:false)
    state(nullable:false,blank:false)
    zip(nullable:false,blank:false)
    phone(nullable:false,blank:false)
    active(nullable:false,blank:false)
    changedate(nullable:false,blank:false)
}

}

现在生成了两个表,并且存在从用户到客户端的外键。尽管阅读了 grails 帮助文档了解如何使用相应的客户端插入用户记录,但我终生无法做到。这是我控制器中的当前代码。客户端插入正确,但不会插入用户记录。

def register(){

    Client newClient = new Client (
        name: params.Company,
        webaddress: params.WebAddress,
        address: params.CompanyAddress,
        city: params.CompanyCity,
        state: params.CompanyState,
        zip: params.CompanyZip,
        phone: params.CompanyPhone,
        active: 1,
        changedate: new Date()          
    )
    newClient.save()
    User user =  new User (
        client: newClient,
        firstName: params.FirstName,
        lastName: params.LastName,
        email: params.userName,
        password: params.Password,
        address: params.Address,
        city: params.City,
        state: params.State,
        zip: params.Zip,
        phone: params.Phone,
        active: 1,
        changedate: new Date()
    )
    user.save()

}

【问题讨论】:

  • 代码看起来不错。您没有提供足够的信息来确定,但可能是您保存用户时验证失败。在调用user.save() 后尝试user.save(failOnError: true) 或打印user.errors
  • params.userName 是嫌疑人。常见的情况是您的请求参数名称以小写字母开头,但由于所有其他参数名称都以大写字母开头,我怀疑实际参数名称可能是 UserName 在这种情况下 params.userName 将评估为空。由于您将其分配给不可为空的 email 属性,因此如果 params.userName 为空,则可以解释问题。
  • 哎呀,用户名确实有一个大写的 U 以及一个带 P 的密码。有时你让学习一门新语言的挫败感让你忘记了编码的基础知识。感谢您的帮助,用户刚刚插入。我觉得很傻。
  • 仅供参考...在实际应用程序代码中,您应该在调用 save() 时检查返回值。如果验证器失败,save() 方法将返回 null。 if(user.save()) { // success } else { // error }.
  • 谢谢,这很有帮助。来自 c# 背景 grails 和 java 通常是一个学习过程。只是在考虑错误处理之前尝试让事情正常工作。

标签: grails model-view-controller groovy grails-orm


【解决方案1】:

尝试以下代码,它将指出验证问题的确切位置,同时将对象保存到数据库(如果有):

def register(){

    Client newClient = new Client (
            name: params.Company,
            webaddress: params.WebAddress,
            address: params.CompanyAddress,
            city: params.CompanyCity,
            state: params.CompanyState,
            zip: params.CompanyZip,
            phone: params.CompanyPhone,
            active: 1,
            changedate: new Date()
    )
    if(newClient.save(flush: true)){
        User user =  new User (
                client: newClient,
                firstName: params.FirstName,
                lastName: params.LastName,
                email: params.userName,
                password: params.Password,
                address: params.Address,
                city: params.City,
                state: params.State,
                zip: params.Zip,
                phone: params.Phone,
                active: 1,
                changedate: new Date()
        )
        if(!user.save(flush: true)){
            user.errors.each {
                println it
            }
        }
    }
    else {
        newClient.errors.each {
            println it
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多