如何在Grails中保存控制器类的外键?

如何在Grails中保存控制器类的外键?,grails,groovy,one-to-many,foreign-key-relationship,Grails,Groovy,One To Many,Foreign Key Relationship,我是Groovy nd Grails的新手。我不知道如何将外键保存到子表中。 我有两个域类,分别是Person和Telephone。我试图保存,但无效。请帮助我 人形 class Person { String name String password static constraints = { name(blank:false) password(blank:false) } s

我是Groovy nd Grails的新手。我不知道如何将外键保存到子表中。 我有两个域类,分别是Person和Telephone。我试图保存,但无效。请帮助我

人形

class Person {

    String name
        String password        
    static constraints = {
        name(blank:false)
                password(blank:false)
    }
    static hasMany = [telephone:Telephone]
    @Override
    public String toString() {
        // TODO Auto-generated method stub
    name
    }
}
电话

class Telephone {

    String number
    Person person
    static constraints = {
        number(blank:false)
        person()
    }
    static belongsTo = [person:Person]
    @Override
    public String toString() {
        // TODO Auto-generated method stub
    number
    }
}
存储在会话变量中的loggin人员Id

session.setAttribute("user_id")
然后我试着保存这个号码

电话控制器

class TelephoneController {

     def index() {
        redirect(action:'create')
         }
    def create(){

    }
def save(){
        def number=new Telephone(params)
        int user_id=Integer.parseInt(session.getAttribute("user_id").toString())
                params.person=user_id       
        if(!number.hasErrors() && number.save()){
            println "save"
            flash.toUser="Person Details [${number.number}] has been added."
            redirect(view:'create')
        }
    }
}

但是它不起作用。请帮帮我。

您的代码看起来有点过于复杂,我相信,您的目标应该更容易实现,请查看Grails文档,它描述了您正在使用的一对多关系:

您的代码看起来有点过于复杂,我相信,您的目标应该更容易实现,尝试查看Grails文档,它描述了您正在使用的一对多关系:

我同意第一个答案。你把代码复杂化了。 如果您只想为一个人存储多个电话号码,这样的内容就足够了:

class Person {

    String name
    String password

    static hasMany = [phoneNumbers:String]

    static constrains = ...
}
基本上,您不需要另一个域类来存储此人的数字列表。然后在控制器中,您需要:

    def save() {
        int user_id = session['user_id'] // no need to parse, Groovy will handle
        def user = Person.get(user_id) // you need to fetch the Person from database (the same applies when using additional Telephone)
        user.phoneNumbers << params.newNumber // the << operator acts here like add(String) method
        user.save()
    }
另外,当使用static belongsTo=[Person:Person]时,您不需要在电话类中声明Person字段。无论如何都将创建该属性


最后一个技巧,在创建域类之后,尝试运行命令grailsgenerateallperson(如果仍然使用grailsgenerateallphone)。这将为您的域类“搭建”默认控制器和视图,您可以使用它们作为示例。

我同意第一个答案。你把代码复杂化了。 如果您只想为一个人存储多个电话号码,这样的内容就足够了:

class Person {

    String name
    String password

    static hasMany = [phoneNumbers:String]

    static constrains = ...
}
基本上,您不需要另一个域类来存储此人的数字列表。然后在控制器中,您需要:

    def save() {
        int user_id = session['user_id'] // no need to parse, Groovy will handle
        def user = Person.get(user_id) // you need to fetch the Person from database (the same applies when using additional Telephone)
        user.phoneNumbers << params.newNumber // the << operator acts here like add(String) method
        user.save()
    }
另外,当使用static belongsTo=[Person:Person]时,您不需要在电话类中声明Person字段。无论如何都将创建该属性

最后一个技巧,在创建域类之后,尝试运行命令grailsgenerateallperson(如果仍然使用grailsgenerateallphone)。这将为您的域类“搭建”默认控制器和视图,您可以使用它们作为示例