[英]JPA many-to-many relationship causing infinite recursion and stack overflow error
[英]JPA many to many relationship causing infinite recursion
編輯:我在兩個類中都使用@JsonIgnoreProperties 解決了這個問題
@JsonIgnoreProperties("pokemons")
@ManyToMany
@JoinTable(
name = "pokemon_types",
joinColumns = @JoinColumn(name = "pokemon_id"),
inverseJoinColumns = @JoinColumn(name = "type_id"))
private Set<Type> types;
@JsonIgnoreProperties("types")
@ManyToMany(mappedBy = "types")
Set<Pokemon> pokemons;
我的 api 中有兩個實體。 具有口袋妖怪具有的“類型”列表的口袋妖怪和具有具有該特定類型的“口袋妖怪”列表的類型。 我正在嘗試在我的控制器中實現 getAll 方法,但我遇到了無限遞歸問題。
我嘗試在我的類型 class 中使用 @JsonIgnore 注釋,但是這樣我無法獲得每種類型中的口袋妖怪列表。 relashionship 的另一面運作良好。
有什么方法可以避免無限遞歸問題,同時獲得兩個 relashionship 列表。
我的存儲庫擴展了 JpaRepository,我的控制器只調用了 JpaRepository 的 findAll 方法。
口袋妖怪:
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
@Entity
@Table(name="pokemons")
public class Pokemon implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private String url;
private String img;
@ManyToMany
@JoinTable(
name = "pokemon_types",
joinColumns = @JoinColumn(name = "pokemon_id"),
inverseJoinColumns = @JoinColumn(name = "type_id"))
private Set<Type> types;
}
類型:
@Setter @Getter @NoArgsConstructor @AllArgsConstructor
@Entity
@Table(name="types")
public class Type implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
@JsonIgnore
@ManyToMany(mappedBy = "types")
Set<Pokemon> pokemons;
}
預期結果:
[
{
id: ...,
name: ...,
pokemons: [
{
id: ...,
name; ...
url: ...
img: ...
},
.
.
.
]
},
.
.
.
]
實際結果:
[
{
id: ...,
name: ...,
},
.
.
.
]
我建議使用來自com.fasterxml.jackson.annotation
ZEFE90A8E604A7C840E88D03A6D8ZF6 的@JsonManagedReference
@JsonBackReference
(后者用於子實體)。
也在這里解釋: https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion第3節
從類型表中刪除 Id 的 getter 也可以
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.