簡體   English   中英

如何從Grails中的控制器類保存外鍵?

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

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

但這不起作用。請幫助我。

我同意第一個答案。 您使代碼過於復雜。 如果您只想為一個人存儲許多電話號碼,那么這樣的話就足夠了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM