1

我是 Groovy nd Grails 的新手。我不知道如何将外键保存到子表中。我有两个名为 Person 和 Telephone 的域类。我试图保存但它不起作用。请帮助我。

Person.groovy

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
    }
}

电话.groovy

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
    }
}

存储在会话变量中的登录人员 ID。

session.setAttribute("user_id")

然后我试图保存号码。

TelephoneController.groovy

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')
        }
    }
}

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

4

2 回答 2

1

我同意第一个答案。您使代码过于复杂。如果你只想为一个人存储许多电话号码,这样的事情就足够了:

class Person {

    String name
    String password

    static hasMany = [phoneNumbers:String]

    static constrains = ...
}

基本上,您不需要另一个域类来仅存储 Person 的数字列表。然后在控制器中,您需要:

    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()
    }

如果决定使用另一个电话类,它看起来像:

    def save() {
        int user_id = session['user_id']
        def user = Person.get(user_id)
        def number = new Telephone(params)
        number.person = user // important to create relation
        number.save() // pay attention here, that in previous example the Person was saved, but now the Telephone is
    }

此外,当使用静态 belongsTo = [person:Person] 时,您不需要在 Telephone 类中声明 Person 字段。无论如何都会创建该属性。

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

于 2012-09-13T11:02:10.553 回答
0

您的代码看起来有点过于复杂,我相信,您的目标应该更容易实现,尝试查看 Grails 文档,它描述了您正在使用的一对多关系:http: //grails.org/doc /latest/guide/GORM.html#oneToMany

于 2012-09-13T09:14:53.687 回答