了解grails中的许多行为以及如何保存关系

时间:2015-12-13 11:40:48

标签: grails gorm

我正在制作一个模型,其中document.addEventListener("click", myfunction, true);填写了许多问卷,答案会保存到User。我正在使用grails 2.5.2

测试1

所以我有两个模特

Questionresponse

通过上述操作,将创建一个新的数据库表:class User { String username ... static hasMany = [reponse: QuestionResponse] } class QuestionResponse { String question_1 String question_2 ... } ,其中包含两列user_questionresponseuser_questionresponses_id。这看起来像我想要的。用户将有许多问题响应,这些关系将保存在此表中。但是,我无法找到如何将数据保存到此表。

例如,如果我这样做:

questionresponse_id

Test2(只需添加belongsTo)

def user = springSecurityService.currentUser
def questionnaire = new QuestionResponse(question_1: "foo", question_2: "bar")
//How do I link the user to this newly created questionnaire?
user.addToResponse(q).save(flush: true) //DOES NOT WORK. 

如果我将class User { String username ... static hasMany = [reponse: QuestionResponse] } class QuestionResponse { String question_1 String question_2 static belongsTo = [user: User] ... } 添加到belongsTo,则会在数据库中创建新列QuestionResponse。现在,如果我运行与上面相同的代码,则此user_id列的ID将填充当前用户的ID。但是,关系表user_id仍为空。

我知道Burt提到的方法,但我认为只有ManyToMany关系才需要这样做。如果所有关系都需要,那么为什么不是默认值?

2 个答案:

答案 0 :(得分:1)

在您的第一种情况下,您在User和QuestionResponse之间存在OneToMany关系,没有任何一方是该关系的所有者。在这种情况下,为了维护User和QuestionResponse之间的关系,需要第三个表。要保留数据,您需要执行以下操作:

userInstance.addToResponse(new QuestionResponse(question_1: "foo", question_2: "bar")).save(flush: true, failOnError: true)

您正在执行user.addToReponse(q)而应该是user.addToReponse(questionnaire),如果它不是拼写错误并且数据实际上没有存储,则通过添加failOnError参数进行检查以保存()方法。有时grails save()方法会无声地失败,它应该告诉你是否是这种情况。

在第二种情况下,您已将父级添加到关系中,这意味着您不需要第三个表来维护关系。在这种情况下,Grails不会创建和填充第三个表。

答案 1 :(得分:0)

第二种方法(在QuestionResponse中添加belongsTo)似乎是正确的做法,因为如果没有用户,QuestionResponse对象不能存在,并且不能属于不同的用户。

在这种情况下,不需要使用第三张表。

第一次运行应用程序时,grails创建了关系表(因为没有belongsTo)。当您使用belongsTo grails再次运行应用程序时,添加user_id字段但不会删除关系表。这就是为什么表是空的并且是空的:它不是必需的,但是grails数据库自动更新功能只会添加东西,它不会删除任何内容。

这同样适用于字段:如果从实体中删除字段,则必须手动将其从数据库中删除。