当前位置: 首页 > 面试题库 >

Hibernate @OneToMany关系导致JSON结果无限循环或空条目

宁锐
2023-03-14
问题内容

我有两个实体,一个实体“电影”和一个实体“剪辑”,每个剪辑都属于一部电影,一部电影可以有多个剪辑。

我的代码如下:

Movie.java
    @OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Clip> clips = new HashSet<Clip>();



 Clip.java

    @ManyToOne
        @JoinColumn(name="movie_id")
        private Movie movie;

正在生成表,每个Clip都有一列“ movie_id”,但这会导致我的应用程序在请求数据时陷入无限循环

    @Path("/{id:[0-9][0-9]*}")
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public Movie lookupMovieById(@PathParam("id") long id) {
            return em.find(Movie.class, id);
        }


result:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"M...

当我请求剪辑时,结果相同。

当我将其更改为@ManyToMany关系时,不会有类似的问题,但这不是我所需要的。你能帮助我吗?将fetchType设置为Lazy无效。

编辑:我正在使用当前的JBoss开发工作室

编辑:

通过阅读本文,我“解决”了这一问题:

http://blog.jonasbandi.net/2009/02/help-needed-mapping-bidirectional-
list.html

“要以一对多的一侧为拥有侧来映射双向一对多,您必须删除mapledBy元素,并将多对一设置为可插入且可更新为false的@JoinColumn。显然,此解决方案未优化并会产生一些其他的UPDATE语句。”

当我请求电影时,我得到以下答案:

{“ id”:1,“版本”:1,“名称”:“ MGS演练”,“文件名”:“ video.mp4”,“电影类别”:[{“ id”:1,“版本”:1, “
name”:“演练”}],“片段”:[],“描述”:“ Trailer zu mgs4”}

条目“剪辑”仍然出现。这仍然是错误的解决方案,还是我只能忍受这个?


问题答案:

我遇到了完全相同的问题。我尝试了引用的段落中的解决方案,但它对我不起作用。

我所做的是在Clip类中为getMovie()返回null,然后无限循环问题消失了。以JSON格式返回的数据看起来像{“ movieId”:1 …
clips:[“ clipId”:1,“ movie”:“ null”,..]}。

如果您还想进一步删除JSON中的movie属性,则将类级注释添加到Clip类@JsonSerialize(include =
JsonSerialize.Inclusion.NON_NULL)

杰克逊功能:防止空值,默认值的序列化

更新:我发现更简单的方法是简单地删除Clip类中的电影吸气剂。



 类似资料:
  • 编辑:这里是我正在使用的架构

  • 我的期望: 如果用户输入的Int不在正确的范围内,程序将给他另一次机会,直到用户给出正确的类型。 所以,我需要一个块。但我有一个无限循环。 我的代码: 我读到: 重置. nextLine()扫描仪 使用扫描仪。扫描仪后面的nextLine()。nextInt() nextInt()的扫描仪错误 扫描仪在使用next()或nextFoo()后跳过nextLine()? 如何使用java.util.扫

  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 我在使用useEffect时搜索了很多关于无限循环的帖子,但仍然没有找到答案 在useEffect中,我试图调用get accounts api,当然,我放置了一个空数组,因为我只希望它在渲染后运行一次。但目前我喜欢添加“addAccount”功能。因此,如果我按下add按钮,它就会发送一个post请求。这里是一个问题,我想检查值是否已更改,因此我将值放入第二个参数,即空数组,它会导致无限循环。但

  • 问题内容: 我试图弄清楚为什么页面在单击时没有导航到其模板。URL更新,并且我没有JS错误。。我相信它 会加载 文件,但随后会无限加载控制器。我在SessionsController的实例化中添加了代码后,发现了这一点。 布局 我的看法 我的JS 在里面,我有个大而光明的人: 问题答案: 我唯一看到的是缺少括号和逗号。您可以尝试以下方法:

  • 我正在创建一个简单的议程应用程序,它作为后端连接到Firebase。我想在每次写入时获取数据,我试图避开一个无限循环。 初始todos状态为null。然而,当我获取Firebase数据时,它会发生变化,然后导致组件本身的重新渲染,这将导致另一次获取,再次导致无限循环。我已经因此打破了Firebase中火花计划的限制,并因为临时阻塞而浪费了几天的工作。我认为这可以用useCallback钩子修复,但