簡體   English   中英

JPA 多對多關系導致無限遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM