表单提交到Grails中的多个域对象

表单提交到Grails中的多个域对象,grails,Grails,我是Grails的新手。我正在学习一个基本的积垢操作。这里我有2个域对象的人和地址。每个人只需要有一个地址 所以我有一个gsp表单,它收集用户名、名字、姓氏、年龄和地址字段,基本上应该存储在数据库Person和address中的两个表中。那么,如何在映射2个域类(Person和Address)的控制器中编写代码呢 谢谢你的回答 更新:我使用了以下不起作用的代码 package com.deltaintech.wr class Person { String username S

我是Grails的新手。我正在学习一个基本的积垢操作。这里我有2个域对象的人和地址。每个人只需要有一个地址

所以我有一个gsp表单,它收集用户名、名字、姓氏、年龄和地址字段,基本上应该存储在数据库Person和address中的两个表中。那么,如何在映射2个域类(Person和Address)的控制器中编写代码呢

谢谢你的回答

更新:我使用了以下不起作用的代码

package com.deltaintech.wr

class Person {
    String username
    String password
    String firstname
    String lastname
    String email
    Address address

    static constraints = {
    }
}


package com.deltaintech.wr

class Address {

    String address1
    String address2
    String city
    String state
    String country
    String zipcode

    static constraints = {
    }
}

package com.deltaintech.wr.register
import com.deltaintech.wr.*

class RegisterController {

    def index = { 

    }

    def register = {

        Person person = new Person(params)
        person.save()

    }
}

<!--
  To change this template, choose Tools | Templates
  and open the template in the editor.
-->

<%@ page contentType="text/html;charset=UTF-8" %>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Sample title</title>
  </head>
  <body>
    <h1>Sample line</h1>
  <g:form action="register">
   User Name <g:textField name="username"/><br>
   Password <g:passwordField name="password" /><br>
   First Name <g:textField name="firstname"/><br>
   Last Name <g:textField name="lastname"/><br>
   Email <g:textField name="email" /><br>
   Address1 <g:textField name="address.address1"/><br>
   Address2 <g:textField name="address.address2" /><br>
   City <g:textField name="address.city" /><br>
    State<g:textField name="address.state" /><br>
    Country <g:textField name="address.country" /><br>
   Zip Code <g:textField name="address.zipcode" /><br>
    <g:submitButton name="create" value="Create"/>
  </g:form>
</body>
</html>


Error 500: Executing action [register] of controller [com.deltaintech.wr.register.RegisterController] caused exception: not-null property references a null or transient value: com.deltaintech.wr.Person.address; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: com.deltaintech.wr.Person.address
Servlet: grails
URI: /system/grails/register/register.dispatch
Exception Message: not-null property references a null or transient value: com.deltaintech.wr.Person.address 
Caused by: not-null property references a null or transient value: com.deltaintech.wr.Person.address 
Class: RegisterController 
At Line: [13] 
package com.deltaintech.wr
班主任{
字符串用户名
字符串密码
字符串名
字符串姓氏
字符串电子邮件
地址
静态约束={
}
}
包com.deltaintech.wr
班级地址{
字符串地址1
字符串地址2
弦城市
字符串状态
弦国
字符串zipcode
静态约束={
}
}
包com.deltaintech.wr.register
导入com.deltaintech.wr*
类注册控制器{
def索引={
}
def寄存器={
人员=新人员(参数)
person.save()
}
}
示例标题
采样线
用户名
密码
名字
姓氏
电子邮件
地址1
地址2
城市
状态
国家
邮政编码
错误500:执行控制器[com.deltaintech.wr.register.RegisterController]的操作[register]导致异常:not null属性引用空值或瞬时值:com.deltaintech.wr.Person.address;嵌套异常为org.hibernate.PropertyValueException:notnull属性引用空值或暂时值:com.deltaintech.wr.Person.address Servlet:grails URI:/system/grails/register/register.dispatch 异常消息:not null属性引用null或瞬态值:com.deltaintech.wr.Person.address 原因:not null属性引用空值或瞬时值:com.deltaintech.wr.Person.address 类别:RegisterController 第[13]行
普惠制必须看起来像:

<g:form action="save">
    <g:textField name="name"/>
    <g:textField name="address.city"/>
</g:form>

我想我忘了什么。尝试以下操作:将static belongsTo=[person:person]添加到address域类。这在person和address之间创建了双向关系,这是同时保存两个域类所必需的。如果您不想这样做,您可以在控制器类中执行以下操作:Address adr=新地址(params.Address);人员=新人员(参数);person.address=adr.save();
<g:form action="save">
    <g:textField name="name"/>
    <g:textField name="address.city"/>
</g:form>
def p = new Person(params)
p.save()