Spring JPA многие ко многим Json показывает неправильный формат данных

#java #mysql #spring #hibernate #spring-data-jpa

#java #mysql #spring #спящий режим #spring-data-jpa

Вопрос:

Я пытаюсь создать API, который имеет отношение «многие ко многим».

JSON, который я пытаюсь вывести, выглядит следующим образом.

     [
    {
        "id": 12,
        "firstname": "asdfghjkl ",
        "surname": "asda",
        "techniqueSet": [
            {
                "id": 0,
                "techniqueName": "java",
            },
            {
                "id": 1,
                "techniqueName": "C#",
                
                    }
                ]
     },
            
    {
        "id": 49,
        "firstname": "asc",
        "surname": "as",
        "techniqueSet": []
    },
    {
        "id": 90,
        "firstname": "JACOB",
        "surname": "LOL",
        "techniqueSet": [
            {
                "id": 0,
                "techniqueName": "Python",
            },
            {
                "id": 1,
                "techniqueName": "Haskell",
                
                    }
                ]
    },
    {
        "id": 92,
        "firstname": "Omar",
        "surname": "LOL",
        "techniqueSet": []
    }
]
 

Тем не менее, я получаю следующее.

 [
    {
        "id": 12,
        "firstname": "asdfghjkl ",
        "surname": "asda",
        "techniqueSet": [
            {
                "id": 0,
                "techniqueName": "Java",
                "playersSet": [
                    12
                ]
            },
            {
                "id": 1,
                "techniqueName": "C#",
                "playersSet": [
                    12,
                    {
                        "id": 90,
                        "firstname": "Jacob",
                        "surname": "LOL",
                        "techniqueSet": [
                            1,
                            {
                                "id": 2,
                                "techniqueName": "Python",
                                "playersSet": [
                                    12,
                                    90
                                ]
                            },
                            {
                                "id": 3,
                                "techniqueName": "Haskell",
                                "playersSet": [
                                    90
                                ]
                            }
                        ]
                    }
                ]
            },
            2
        ]
    },
    {
        "id": 49,
        "firstname": "asc",
        "surname": "as",
        "techniqueSet": []
    },
    {
        "id": 90,
        "firstname": "LOL",
        "surname": "LOL",
        "techniqueSet": []
    },
    91,
    {
        "id": 92,
        "firstname": "Omar",
        "surname": "LOL",
        "techniqueSet": []
    }
]
 

Мои Java следующие объекты

 @Entity
@Table(name = "players")
@EntityListeners(AuditingEntityListener.class)
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Players {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="player_id")
    private int id;
    private String firstname;
    private String surname;
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "able_to_use",
            joinColumns = {@JoinColumn(name = "player_id", referencedColumnName = "player_id")},
            inverseJoinColumns = {@JoinColumn(name = "technique_id", referencedColumnName = "id")}
    )
    private List<Technique> techniqueSet ;
    //Getters and setters
 

Моя вторая сущность

 @Entity
@Table(name = "technique")
@EntityListeners(AuditingEntityListener.class)

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Technique {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @Column(name = "technique_name")
    private String techniqueName;
    @ManyToMany(mappedBy = "techniqueSet", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Players> playersSet ;

    //Getters and Setter
 

Не могли бы вы помочь? Я новичок в JPA framework. Я думаю, что ошибка может заключаться в том, как соединение упоминается в каждом объекте.

Ответ №1:

Вы должны либо создать playersSet свойство в Technique классе transient , либо использовать @JsonIgnore .

Здесь происходит рекурсивная сериализация. Сначала сериализуется проигрыватель, затем он переходит к классу Technique, но в классе Technique также есть игроки в своей области. Так что это также будет сериализовано (снова).

Для получения дополнительной информации о аннотации Джексона прочитайте это простое вступление

Для получения дополнительной информации о переходных процессах в Java прочитайте эту статью

Комментарии:

1. проблема, с которой я сталкиваюсь сейчас. кажется, что если в наборе методов уже есть значение, он не будет печатать JSON снова, если, допустим, другому игроку нужно то же значение. Вы знаете, как это исправить?