如何在Grails中保存控制器类的外键?
我是Groovy nd Grails的新手。我不知道如何将外键保存到子表中。 我有两个域类,分别是Person和Telephone。我试图保存,但无效。请帮助我 人形如何在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
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)。这将为您的域类“搭建”默认控制器和视图,您可以使用它们作为示例