为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot @OneToMany 映射

Spring Boot @OneToMany 映射

慕森王 2023-07-28 10:21:44
我正在学习Spring Boot,我有点困惑。我创建了帖子和评论模型,我希望帖子有很多评论。@OneToMany(cascade = CascadeType.ALL)@JoinColumn(name ="post_id")private List<Comment> comments = new ArrayList<>();这是评论:@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "post_id")private Post post;因此,当我返回单个帖子时,我希望有评论数组,但由于错误:java.lang.IllegalStateException Cannot call sendError() ,我必须设置@JsonIgnore评论获取器。映射的最佳实践是什么,我如何获得帖子评论,我猜,不推荐新的http请求?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

您应该@JoinColumn在一个相关对象上使用,mappedBy在第二个对象上使用。尝试使其成为这样:


@OneToMany(cascade = CascadeType.ALL, mappedBy="post")

private List<Comment> comments;

在 Post 实体中,在 Comment 实体中:


@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = "post_id")

private Post post;

mappedBy需要在第二个实体中存储带有属性名称的字符串。如果您存储有关帖子的信息的字段名称为“post”,则必须将其设置为“post”。


查看完整回答
反对 回复 2023-07-28
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

这应该是一个非常直接和简单的案例。


你的Post类应该是这样的:

@OneToMany(mappedBy="post",

           cascade=CascadeType.ALL)

private List<Comment> comments;

这里重要的部分是mappedBy,它指的是Comment类中的post属性。


请记住,将级联设置为 ALL 意味着删除帖子将删除与该帖子相关的所有评论(我认为这就是您想要的)。


评论类

完成此操作后,您现在可以处理您的Comment类,它将如下所示:


@ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE,

                    CascadeType.DETACH, CascadeType.REFRESH})

@JoinColumn(name="post_id")

private Post post;

@JoinColumn 指数据库中保存与评论相关的帖子 ID 的列,这就是帖子和评论之间的联系。


查看完整回答
反对 回复 2023-07-28
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您还可以@JoinColumn在父类中配置(这一行)


@OneToMany(cascade = CascadeType.ALL)

@JoinColumn(name = "post_id")

private List<Comment> comments = new ArrayList<>();

但你需要删除整个代码


@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = "post_id")

private Post post;

来自你的评论课。这种映射可以用来避免添加@JsonIgnore注释 getter。


现在,您可以轻松保存带有评论列表的帖子类,并且还可以获得带有关联评论列表的帖子类。


查看完整回答
反对 回复 2023-07-28
  • 3 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信