如果在添加关系后调用 Grails save() 不会保存

Posted

技术标签:

【中文标题】如果在添加关系后调用 Grails save() 不会保存【英文标题】:Grails save() doesn't save if called after relationship is added 【发布时间】:2009-09-30 08:41:12 【问题描述】:

我有两个域类 - Person 有很多书。如果我创建一个 Person,调用 save(),然后创建 + 添加 Books 到 Person,一切 被持久化到数据库中。如果我创建一个人,然后创建+添加 书籍,然后是 save(),没有任何东西被持久化。

示例代码:

class Person 
   ...
   static hasMany = [books: Book]


class Book 
   ...
   static belongsTo = [person: Person]

工作,保存到数据库:

def person = new Person(...).save()
def book = new Book(...)
person.addToBooks(book)

不起作用,不保存到数据库:

def person = new Person(...)
def book = new Book(...)
person.addToBooks(book)
person.save()

这是为什么?

我从 Groovy 控制台运行它。我试过打电话给ctx.sessionFactory.currentSession.clear(),但没有帮助。

已解决:我附在此人身上的书有错误。通过调用person.hasErrors()getErrors(),我可以看到我的书未能通过验证。这是从 Grails 控制台运行的,因此没有任何验证错误消息。

【问题讨论】:

【参考方案1】:

您需要像这样手动刷新休眠会话:

person.save(flush:true)

【讨论】:

【参考方案2】:

我不确定,但我认为这是因为 save() 设置了 Person 的 ID,它需要能够将一本书添加到它的图书集合中。

我建议对 Hibernate 收集行为进行一些谷歌搜索,这可能是 Hibernate 的工作方式,也可能是您正在使用的 Grails 版本中的错误。

要尝试的另一件事是使用 person.save(flush:true) 强制刷新

【讨论】:

以上是关于如果在添加关系后调用 Grails save() 不会保存的主要内容,如果未能解决你的问题,请参考以下文章

圣杯。调用保存后id为空

升级后 Grails 验证不起作用

我在哪里可以在 grails 服务器角度客户端上添加代码

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

如何使事务在 Grails 中工作

如何在 Grails 中显示异常?