Рекурсивность с Весной и Джексоном - PullRequest
0 голосов
/ 11 марта 2020

Мне нужно создать модель с древовидными объектами, у которой все тогда есть ссылка между другими, мне нужно сериализовать это в мое приложение AngularJS, используя API Джексона, но, когда я достигаю конечной точки, JSON, что возвращается неверно. Есть в любом случае, чтобы сделать это? Лучший способ или способ исправить это?

Место класса:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Entity(name = "od_places")
public class place {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @Column
    private int number;

    @Column
    private int zone;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "place_id")
    private List<Dweller> dwellers;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "id")
    private List<Route> routes;

    @Column
    private Geometry geom;

    @Column
    private float x;

    @Column
    private float y;

    @Column
    private Date lastUpdate;

    @Column
    private Date regDate;

    @Column
    private boolean disabled;
}

Класс жильца:

@Entity(name = "od_dweller")
public class Dweller {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String gender;

    @Column
    private boolean deficientient;

    @Column
    private String ageRange;

    @Column
    private String schooling;

    @Column
    private String ocupation;

    @ManyToOne
    private Place place;

    @Column
    private Date lastUpdate;

    @Column
    private Date regDate;

    @Column
    private boolean disabled;
}

Класс маршрута:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Entity(name = "od_routes")
public class Route {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String weekDay;

    @Column
    private int trip;

    @OneToOne(orphanRemoval = true)
    private Place origin;

    @Column
    private String departureTime;

    @OneToOne(orphanRemoval = true)
    private Place destiny;

    @Column
    private String arrivalTime;

    @OneToOne(orphanRemoval = true)
    private Dweller dweller;

    @Column
    private String reason;

    @Column
    private String travelMode;

    @Column
    private Date lastUpdate;

    @Column
    private Date regDate;

    @Column
    private boolean disabled;
}

Ответ почтальона:

[
{
    "id": 1,
    "name": "Prefeito Mario de Menezes, Avenida",
    "number": 1,
    "zone": 1,
    "dwellers": [
        {
            "id": 1,
            "gender": "Masculino",
            "deficient": false,
            "ageRange": "20 Anos",
            "schooling": "Graduado",
            "ocupation": "Assalariado",
            "place": 1,
            "lastUpdate": 1583895600000,
            "regDate": 1583895600000,
            "disabled": false
        }
    ],
    "routes": [
        {
            "id": 1,
            "weekDay": "Terça-Feira",
            "trip": 1,
            "origin": 1, // THIS SHOULD BE AN OBJECT!
            "departureTime": "08:00 - 08:29",
            "destiny": {
                "id": 2,
                "logDom": "Ronat Valter Sodré, Rua",
                "numLogDom": 2,
                "ztDom": 2,
                "dwellers": [],
                "routes": [
                    {
                        "id": 2,
                        "weekDay": "Terça-Feira",
                        "trip": 2,
                        "origin": 2,
                        "departureTime": "08:30 - 08:59",
                        "destiny": 1,
                        "arrivalTime": "11:30 - 11:59",
                        "dweller": {
                            "id": 1,
                            "gender": "Masculino",
                            "deficient": false,
                            "ageRange": "20 Anos",
                            "schooling": "Graduado",
                            "ocupation": "Assalariado",
                            "place": 1, // THIS SHOULD ALSO BE AN OBJECT!
                            "lastUpdate": 1583895600000,
                            "regDate": 1583895600000,
                            "disabled": false
                        },
                        "reason": "Retorno à residência",
                        "travelMode": "Moto (como motorista)",
                        "lastUpdate": 1583895600000,
                        "regDate": 1583895600000,
                        "disabled": false
                    }
                ],
                "geom": null,
                "x": -23.274357,
                "y": -51.060287,
                "lastUpdate": 1583809200000,
                "regDate": 1583809200000,
                "disabled": false
            },
            "arrivalTime": "08:00 - 08:29",
            "dweller": {
                "id": 1,
                "gender": "Masculino",
                "deficient": false,
                "ageRange": "20 Anos",
                "schooling": "Graduado",
                "ocupation": "Assalariado",
                "place": 1,
                "lastUpdate": 1583895600000,
                "regDate": 1583895600000,
                "disabled": false
            },
            "reason": "Lazer",
            "travelMode": "Moto (como motorista)",
            "lastUpdate": 1583895600000,
            "regDate": 1583895600000,
            "disabled": false
        }
    ],
    "geom": null,
    "x": -23.266556,
    "y": -51.038334,
    "lastUpdate": 1583809200000,
    "regDate": 1583809200000,
    "disabled": false
},
2, // THIS NUMBER TWO BREAKS EVERYTHING HERE! WHERE IS MY SECOND OBJECT?
.... // The others object are returned as the first one, just the second object returns as a number 2.
]
}

Несколько вещей, чтобы прояснить: мне действительно нужен список на модели Place, потому что я хочу, чтобы каждое место, которое я загружаю, приходило с его маршрутами. Я работаю с Postgres. Все данные MOCK.

Что я хочу: я хочу решить эту проблему, сделать ее лучше и узнать, почему и как это работает.

1 Ответ

0 голосов
/ 24 апреля 2020

Ответ, который Николай Шевченко дал на комментарии, сработал для меня!

"На вашем месте у вас отношения один-ко-многим с Рутом и Жителем, в то время как в Руте и Двеллером у вас есть один-к-одному связь (в обратном направлении) с Place. Итак, сначала вы должны правильно спроектировать свои таблицы. Также эта ссылка может быть полезна для рекурсивных ссылок Джексона https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion "

...