Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA和Jackson JSON避免无限递归(StackOverflowError),而不会丢失信息_Java_Hibernate_Spring Boot_Jackson_Spring Data Jpa - Fatal编程技术网

Java 使用JPA和Jackson JSON避免无限递归(StackOverflowError),而不会丢失信息

Java 使用JPA和Jackson JSON避免无限递归(StackOverflowError),而不会丢失信息,java,hibernate,spring-boot,jackson,spring-data-jpa,Java,Hibernate,Spring Boot,Jackson,Spring Data Jpa,我有三个班:电影班、演员班和一个叫电影演员的中级班。 电影演员与电影和演员有着千丝万缕的联系,他们都与电影演员有着千丝万缕的联系,因为我想知道演员和所有参与电影的演员的所有电影 我尝试使用@JsonIgnore或@JsonManagedReference和@JsonBackReference,但如果我使用它们,我在搜索电影时会丢失演员信息,在搜索演员时会丢失电影信息 我想知道是否有办法获得所有信息并避免无限循环 电影类别: @Entity public class Film{ priv

我有三个班:电影班、演员班和一个叫电影演员的中级班。 电影演员与电影和演员有着千丝万缕的联系,他们都与电影演员有着千丝万缕的联系,因为我想知道演员和所有参与电影的演员的所有电影

我尝试使用@JsonIgnore或@JsonManagedReference和@JsonBackReference,但如果我使用它们,我在搜索电影时会丢失演员信息,在搜索演员时会丢失电影信息

我想知道是否有办法获得所有信息并避免无限循环

电影类别:

@Entity
public class Film{

    private List<FilmActor> cast;

    @OneToMany(mappedBy="filmActorFilm")
    public List<FilmActor> getCast() {
        return cast;
    }

}
编辑

我想我一开始还不够清楚。我正试图用spring boot制作一个rest服务器,当我试图获取一部电影的演员列表和一名演员的电影列表时,我的问题就出现了。当我尝试获取一部电影时,应用程序会获取属性Cast,这是一个FilmActor列表,如果我没有制作任何东西,这会导致一个无限循环,因为类FilmActor也有类Film

我可以在getFilmActor方法的getter上使用注释@JsonIgnore,或者在Film和FilmActor类的相应方法中同时使用注释@JsonManagedReference和@JsonBackReference,轻松避免这种情况。通过这些注释,我可以避免无限循环,因为当我获得电影时,应用程序会跳过带有@JsonIgnore的属性。在本例中,filmActorFilm就是所讨论的电影。问题是,如果我跳过这个属性,我在搜索演员时不会得到它,我唯一能知道的是演员参与的电影数量,但我也想获得电影的信息,为此我必须去掉Json注释。同样的问题以相反的方式出现,试图让所有的演员都参与一部电影


因此,我要寻找的是一种方法,只有当我拍到电影时才跳过属性filmActorFilm,当我拍到演员时才跳过属性filmActorFilm。

你可能可以看看这两个答案(在StackOverflow之前已经回答过)中的相应问题,即。您一定会深入了解如何在hibernate中高效地使用这些注释(
@OneToMany
@ManyToOne
@JoinColumn
等),以便获得最佳结果。

我遇到了与您相同的问题。对于我来说,我有sourceBatch和childBatch,而不是Actor和Film,并且必须@JsonIgnore我的childBatch

这是我的解决办法

--为实体类(也是其getter和setter)中忽略的值创建一个临时字段

@Transient
@JsonProperty('tempChildBatches')
私有集合tempChildBatches=new ArrayList();
--在将数据传递到前端的@Controller类方法中

Collection<Batch> tempHolder = batch.getChildBatches(); //Original JsonIgnored field getter method
batch.setTempChildBatches(tempHolder); //Setter for the transient field
Collection tempHolder=batch.getChildBatches()//原始JsonIgnored字段getter方法
批次。setTempChildBatches(临时持有人)//瞬态场设置器

现在,您的前端应该能够通过这个瞬态字段接收@JsonIgnore数据。希望有帮助。

您正在显示jpa/hibernate注释。与jackson有什么关系?@SharonBenAsher与jackson的关系是springboot使用它返回JSON中类的字段,我想。我提到的属性(JsonIgnore、JsonManagedReference和JsonBackReference)也属于Jackson。顺便说一句,我想我对我的问题不是很清楚,所以我要编辑它。对不起,我对我的问题不是很清楚,这不是我要找的,我要编辑我的问题。
@Entity
public class FilmActor{

    public Film filmActorFilm;
    public Actor filmActorActor;

    @ManyToOne(optional=false,fetch=FetchType.LAZY)
    @JoinColumn(name="filmActorFilm")
    public Film getFilmActorFilm() {
        return filmActorFilm;
    }

    @ManyToOne(optional=false,fetch=FetchType.LAZY)
    @JoinColumn(name="filmActorActor")
    public Actor getFilmActorActor() {
        return filmActorActor;
    }

}
@Transient
@JsonProperty('tempChildBatches')
private Collection<Batch> tempChildBatches = new ArrayList<>();
Collection<Batch> tempHolder = batch.getChildBatches(); //Original JsonIgnored field getter method
batch.setTempChildBatches(tempHolder); //Setter for the transient field