зацикливание @OneToMany и @ManyToOne

250
05 января 2019, 18:50

При запросе в Postman'e

personwithcars?personid={personId}

Получается цикл:

{"id":1,"name":"Eliah","birthdate":"03.08.1995","cars":[{"id":1,"model":"BMW-X5","horsepower":250,"owner":{"id":1,"name":"Eliah","birthdate":"03.08.1995","cars":[{"id":1,"model":"BMW-X5","horsepower":250,"owner":{"id":1,"name":"Eliah","birthdate":"03.08.1995","cars":[{"id":1,"model":"BMW-X5","horsepower":250,"owner":

Сущность Car:

package ru.lanit.rest.model;
import org.codehaus.jackson.annotate.JsonManagedReference;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;
@Entity
@Table(name="car")
public class Car implements Serializable {
    @Id
    @NotNull
    private Long id;
    @Column(name = "model")
    @NotNull
    private String model;
    @Column(name = "horse_power")
    @NotNull
    private Integer horsepower;
    @NotNull
    @JsonManagedReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner_id")
    private Person owner;
    @NotNull
    @Column(name = "ownerid")
    private Long ownerId;
    public Long getOwnerId() {
        return ownerId;
    }
    public void setOwnerId(Long ownerId) {
        this.ownerId = ownerId;
    }
    public Car(){}
    public Car(Long id, String model, Integer horsepower, Long ownerId){
        this.id = id;
        this.model = model;
        this.horsepower = horsepower;
        this.ownerId = ownerId;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        if(model.matches("^[a-zA-Z0-9]+-[a-zA-Z0-9]+$"))
        this.model = model;
    }
    public Integer getHorsepower() {
        return horsepower;
    }
    public void setHorsepower(Integer horsepower) {
        this.horsepower = horsepower;
    }
    public Person getOwner() {
        return owner;
    }
    public void setOwner(Person owner) {
        this.owner = owner;
    }
}

Сущность Person:

package ru.lanit.rest.model;

import org.codehaus.jackson.annotate.JsonBackReference;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Set;
@Entity
@Table(name="person")
public class Person implements Serializable {
    @Id
    @NotNull
    private Long id;
    @Column(name="name")
    @NotNull
    private String name;
    @Column(name="birthdate")
    @NotNull
    private String birthdate;
    @JsonBackReference
    @OneToMany(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<Car> cars;

    public Person(){}
    public Person(Long id, String name, String birthdate){
        setId(id);
        setName(name);
        try {
            setBirthdate(birthdate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    public Person(Long id){
        setId(id);
    }
    public void setCars(Set<Car> cars) {
        this.cars = cars;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getBirthdate() {
        return birthdate;
    }
    public void setBirthdate(String birthdate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        sdf.parse(birthdate);
        this.birthdate = birthdate;
    }
    public Set<Car> getCars() {
        return cars;
    }
}

Пытался писать свой метод toString(), использовать аннотации @JsonBackReference и @JsonManagedReference, а так же просто @JsonIgnore. При последнем список машин не отображается вовсе, а при остальных цикл не пропадает.

Вопрос: как избавится от зацикливания?

Answer 1

Использовал DTO (Data Transfer Object): закинул переменные, которые необходимо было показать при GET запросе и возвращал этот Объект.

READ ALSO
Поток FileWriter

Поток FileWriter

В общем, не могу разобраться как сделать что-бы в файл записывался результат каждого цикла, а не последнего, подскажите, пожалуйста, как можно...

152
JAVA JAVAFX Как создать папку в zip архиве, используя filesystem?

JAVA JAVAFX Как создать папку в zip архиве, используя filesystem?

Использую следующую конструкцию

168
Шрифт на iPhone мелче, чем нужно

Шрифт на iPhone мелче, чем нужно

Подскажите, почему на iPhone шрифт номеров телефонов в подвале сайта мелкий, хотя свойствами он стоит больше гораздоЧерез проверку через браузер...

187
Как ссылку на сайте открыть в приложении андроид?

Как ссылку на сайте открыть в приложении андроид?

Коллеги, на сайте есть обычная ссылка

202