gpt4 book ai didi

Grails:创建多对多的关系?

转载 作者:行者123 更新时间:2023-12-02 14:40:00 26 4
gpt4 key购买 nike

所以我目前正在构建一个 Grails 应用程序,并且我正在尝试允许用户创建帖子,并且这些帖子也有评论。

我正在尝试创建的关联类似于:

一个用户可以有 0 到多个帖子,并且
帖子可以有 0 到多个评论

我尝试使用我的域类进行设置,如下所示:

class User implements Serializable{
static hasMany = [created_posts: Post]
String username
String password
}

class Post {
static hasMany = [comments: Comment]
String description
}

class Comment {
String comment_body
static belongsTo = [post: Post]
}

我也尝试使用 mappedBy 属性,如下所示:
class User implements Serializable{
static hasMany = [created_posts: Post]
static mappedBy = [created_posts: 'creator']
String username
String password
}

class Post {
static hasMany = [comments: Comment]
static belongsTo = [creator: User]
String description
}

class Comment {
String comment_body
static belongsTo = [post: Post]
}

但这仍然行不通。我用来创建它的代码如下:
Post new_post = new Post(description: "testing").save()
User user = User.get(springSecurityService.principal.id)
user.addToCreated_posts(new_post).save()

不幸的是,Grails 似乎无法执行最后一行,有时它根本无法编译,从而产生 :bootRun 错误。

我不确定如何在用户、帖子和评论之间创建正确的关联。欢迎提供任何帮助并非常感谢!

编辑:我当前的代码:(编译,但不保存到用户的设置)
class User implements Serializable{
static hasMany = [createdPosts: Post]
static mappedBy = [createdPosts: 'creator']
String username
String password
}

class Post {
static hasMany = [comments: Comment]
static belongsTo = [creator: User]
String description
static constraints = { creator nullable: true }
}

class Comment {
String comment_body
static belongsTo = [post: Post]
}

我在 Controller 中使用的代码:
User user = User.get(springSecurityService.principal.id)
Post new_post = new Post(description: "testing description", creator: user).save()
user.save()
System.out.println("post saved to user? " + user.getCreatedPosts())

输出是:
post saved to user? []

最佳答案

问题很可能是 save()函数不返回已保存的对象。

最初,我将您的代码更改为:

Post new_post = new Post(description: "testing")
new_post.save()
User user = User.get(springSecurityService.principal.id)
user.addToCreated_posts(new_post).save()

哪个编译了。但是,还有一个问题 - 您必须设置属性 creator,而不是运行 user.addToCreated_posts。 new_post,因为您在创建 Post 域类时没有明确指定它可以为空。因此,调用 save()会默默地失败。

如果您将代码更改为:
User user = User.get(springSecurityService.principal.id)
Post new_post = new Post(description: "testing", creator: user)
new_post.save()

您的代码应该可以工作。

将所有调用替换为 save() 可能也是一个好主意。与 save(failOnError: true) ,这样当保存失败时,就会抛出异常。您可以捕获此异常,并从异常中提取错误消息。通常,错误消息与域对象的验证失败有关。

这是在 Grails 3.2.7 上使用 H2(与 Grails 打包的默认内存数据库)在 Grails 3.2.7 上进行测试的。

编辑 这是基于对问题所做的更新的更新片段。

你在运行:
User user = User.get(springSecurityService.principal.id)
Post new_post = new Post(description: "testing description", creator: user).save()
user.save()
System.out.println("post saved to user? " + user.getCreatedPosts())

我会将其更改为:
User user = User.get(springSecurityService.principal.id)
Post new_post = new Post(description: "testing description", creator: user)
new_post.save(failOnError: true)
System.out.println("post saved to user? " + user.getCreatedPosts())

我这样做的原因是因为您没有保存用户 - 您正在保存帖子。当您为用户创建帖子时,Grails 会在数据库中搜索其 creator_id 列设置为您调用该方法的用户的 id 的帖子。

另外,我会确保您没有从 User.groovy 中删除以下行:
static hasMany = [createdPosts: Post]
static mappedBy = [createdPosts: "creator"]

你绝对会 需要 Post.groovy 中的以下内容:
static belongsTo = [creator: User]

这样,Grails 就知道应该如何为用户查找帖子。

进行这些更改后,请确保从新的数据库开始 - 对于内存中的 H2,这应该自动完成,只要您使用开发环境 - 并重新启动服务器。

关于Grails:创建多对多的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967161/

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