gpt4 book ai didi

Grails hasMany关联不保存到连接表

转载 作者:行者123 更新时间:2023-12-02 15:15:32 25 4
gpt4 key购买 nike

我有一个 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_books 的表,其中包含键 author_id 和 book_id。
Author table
Books table
empty author_book table
table structure

最佳答案

您没有显示足够的上下文来确定,但我希望保存发生在有问题的上下文中,可能是因为 session 没有被刷新。验证这一点的一种方法是在保存时刷新 session 。
请参阅 https://github.com/jeffbrown/prabinupretirelationship 上的项目.
https://github.com/jeffbrown/prabinupretirelationship/blob/2fcf133f65309e449b408f4152f3a36fbb053a3e/grails-app/domain/prabinupretirelationship/Author.groovy

package prabinupretirelationship

class Author {

String name
static hasMany = [books : Book]
static constraints = {
}
}
https://github.com/jeffbrown/prabinupretirelationship/blob/2fcf133f65309e449b408f4152f3a36fbb053a3e/grails-app/domain/prabinupretirelationship/Book.groovy
package prabinupretirelationship

class Book {

String title

static constraints = {
}
}
https://github.com/jeffbrown/prabinupretirelationship/blob/2fcf133f65309e449b408f4152f3a36fbb053a3e/grails-app/init/prabinupretirelationship/BootStrap.groovy
(注意:我实际上不会这样做,但我正在尝试使用与您询问的方法接近的代码。更好的想法是将持久性逻辑移动到 GORM 数据服务( http://gorm.grails.org/7.0.4/hibernate/manual/index.html#dataServices )中,其中事务和 session 将全部由 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设置为 truehttps://github.com/jeffbrown/prabinupretirelationship/blob/2fcf133f65309e449b408f4152f3a36fbb053a3e/grails-app/conf/application.yml#L106 .
当应用程序运行时,以下 SQL 语句将发送到数据库,包括填充连接表:
Hibernate: insert into author (id, version, name) values (null, ?, ?)
Hibernate: insert into book (id, version, title) values (null, ?, ?)
Hibernate: insert into book (id, version, title) values (null, ?, ?)
Hibernate: insert into author_book (author_books_id, book_id) values (?, ?)
Hibernate: insert into author_book (author_books_id, book_id) values (?, ?)

关于Grails hasMany关联不保存到连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63593130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com