Двунаправленный JPA ManyToOne/OneToMany получает дубликаты данных

Я создаю REST API с Spring 2.1, и я получаю повторяющиеся данные для консультации с отношениями ManyToOne.

Местность:

@Entity
@Table(name = "localidad")
public class Localidad implements Serializable {

    private static final long serialVersionUID = -7258462202419598287L;

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

    private String nombreLocalidad;

    private BigDecimal precioEnvio;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "provinciaIdProvincia")
    private Provincia provincia;

    public Localidad() {}

    public Localidad(String nombreLocalidad, BigDecimal precioEnvio) {
        this.nombreLocalidad = nombreLocalidad;
        this.precioEnvio = precioEnvio;
    }
...

Провинция:

@Entity
@Table(name = "provincia")
public class Provincia implements Serializable {

    private static final long serialVersionUID = 3324427184301992595L;

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

    private String nombreProvincia;

    @OneToMany(mappedBy= "provincia", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Localidad> localidades = new HashSet<Localidad>();

    public Provincia() {}

    public Provincia(String nombreProvincia) {
        this.nombreProvincia = nombreProvincia;
    }
...

Я получаю доступ к информации, реализуя CrudRepository и Service @Autowired.

Дубликат данных HTTP GET-запрос:

Дублирующиеся данные

Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
174
1

Ответы 1

Проблема вызвана тем, что Джексон выполняет циклическую сериализацию полей provincia и localidades. Это можно решить с помощью аннотации @JsonIgnoreProperties. поэтому в классе или объекте Localidad добавьте аннотацию следующим образом:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "provinciaIdProvincia")
@JsonIgnoreProperties("localidades")
private Provincia provincia;

И в классе Provincia измените Set<Localidad> (кстати, вместо этого вы можете просто использовать List<Localidad>) следующим образом:

@OneToMany(mappedBy= "provincia", cascade = CascadeType.ALL, fetch = 
FetchType.LAZY)
@JsonIgnoreProperties("provincia")
private Set<Localidad> localidades = new HashSet<Localidad>();

С этими изменениями ваш Rest API теперь не должен показывать дубликатов. Вы должны игнорировать поля, которые определяют связь между двумя классами или сущностями. Если вы использовали @JsonProperty для определения имен полей, используйте имена, используемые в определении @JsonProperty для @JsonIgnoreProperties.

Другие вопросы по теме