如何解决Grails具有许多关联未保存到联接表中
我有一个Grails 4.0.3应用程序。我只是开始测试一些域映射。看来我无法建立一对多的关系。现在,我正在尝试一种简单的一对多关系。
这是我的实现方式
class Author {
String name
static hasMany = [books : Book]
static constraints = {
}
}
class Book {
String title
static constraints = {
}
}
我已经启动了:
def author = new Author('name':"Author")
author.addToBooks(new Book('title':"Book1"))
author.addToBooks(new Book('title':"Book2"))
author.save()
我桌上有作者和书籍,但没有关系。
以下代码给出了空列表。
def author = Author.get(1)
def books = author.books
不确定我缺少什么。我已经阅读了很多与此问题类似的答案,并且有人建议使用单独的联接类。但是我正在升级我现有的应用程序,并且在很多地方都在使用addTo语法。所以我要坚持下去。 至少,我想知道为什么这不起作用,因为这是标准实现。
我还显示了图像中生成的联接表结构。 看来联接表的结构也不是很正确。我的理解是,它应该使用键author_id和book_id创建一个名称为author_books的表。
解决方法
您没有显示足够的上下文来确定,但是我希望保存是在有问题的上下文中进行的,可能是因为未刷新会话。一种验证方法是在保存时刷新会话。
查看位于https://github.com/jeffbrown/prabinupretirelationship的项目。
package prabinupretirelationship
class Author {
String name
static hasMany = [books : Book]
static constraints = {
}
}
package prabinupretirelationship
class Book {
String title
static constraints = {
}
}
(注意:我实际上不会这样做,但是我正在尝试使用与您所要求的方法接近的代码。一个更好的主意是将持久性逻辑移至GORM数据服务({{ 3}}),所有事务和会话都将由GORM管理。)
package prabinupretirelationship
class BootStrap {
def init = { servletContext ->
Author.withTransaction {
def author = new Author('name': "Author")
author.addToBooks(new Book('title': "Book1"))
author.addToBooks(new Book('title': "Book2"))
author.save(flush: true)
}
}
def destroy = {
}
}
logSql
在http://gorm.grails.org/7.0.4/hibernate/manual/index.html#dataServices处设置为true
。
运行该应用程序时,会将以下SQL语句发送到数据库,包括填充联接表:
Hibernate: insert into author (id,version,name) values (null,?,?)
Hibernate: insert into book (id,title) values (null,?)
Hibernate: insert into author_book (author_books_id,book_id) values (?,?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。