繁体   English   中英

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

How to save a Foreign key from a controller class in Grails?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

登录人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')
        }
    }
}

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

2 个回复

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

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)。 这将“架设”域类的默认控制器和视图,您可以将其用作示例。

您的代码看起来有些复杂,我认为您应该更轻松地实现目标,请尝试阅读Grails文档,该文档描述了一对多关系,您正在使用: http : //grails.org/doc /latest/guide/GORM.html#oneToMany

1 如何在grails中更新外键

我在域类Semester的实例中更新外键时遇到问题。 我是Groovy Grails的新手。 当我创建新的学期时,一切正常。 学期 季节 SemesterController.groovy edit.gsp 当我尝试保存更改时,出现以下异常: 我 ...

3 Grails-如何将参数从另一个控制器保存到控制器

我有一个具体的问题; 我是grails的新手,我正尝试在这种情况下编写一些测试应用程序; 我有2个域类 1汽车2注册 我想添加一些带有品牌,型号等的汽车。用户将从列表中选择一些汽车,然后单击以租车按钮。 当用户单击以租车时,按钮将在此处打开注册/创建页面:我选择的汽车的 ...

4 Grails域类外键映射

我想问一个关于我的特定问题。 例如,我有一个资源表,该表具有product_id作为表Product的外键。 现在,我的第三个表Consumer应该有一个外键resource_product_id,该外键正好指向Resource表的product_id列。 我应该如何在grails ...

5 如何在Grails中将外键映射为主键?

我有一个与主键和外键具有相同属性的旧数据库。 我正在尝试从Grails映射它,但是我有问题。 这是我的域类: 这是数据库表: 我读了这个问题Grails:外键作为主键? 但这对我不起作用:当我使用组合键时,grails要求我提供accommodation_id ,但是我的表 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM