Java 使用JPA和Jackson JSON避免无限递归(StackOverflowError),而不会丢失信息
我有三个班:电影班、演员班和一个叫电影演员的中级班。 电影演员与电影和演员有着千丝万缕的联系,他们都与电影演员有着千丝万缕的联系,因为我想知道演员和所有参与电影的演员的所有电影 我尝试使用@JsonIgnore或@JsonManagedReference和@JsonBackReference,但如果我使用它们,我在搜索电影时会丢失演员信息,在搜索演员时会丢失电影信息 我想知道是否有办法获得所有信息并避免无限循环 电影类别: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
@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