Дублирующие данные в отношении один ко многим

Имею такие entity:

@Entity
@Table
public class Article implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "article_name")
private String articleName;
private String content;
private Date date;

@ManyToOne(fetch = FetchType.LAZY)
private Product product;

_

@Entity
@Table
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "product_name")
private String productName;

private String description;
private int salary;

@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Article> articles;

Генерация бд:

    create table article (
                         id serial,
                         article_name varchar(255),
                         content varchar(3000),
                         date timestamp,
                         product_id int8,
                         primary key (id)
);


    create table product (
                             id serial,
                             description varchar(2000),
                             product_name varchar(255),
                             salary int4 not null,
                             primary key (id)
);
    
    alter table if exists article
        add constraint FKbxy24ht14wxvuhu2fo3w4de3b
            foreign key (product_id)
                references product

Затем при любых запросах вижу это:

{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android N2","content":"here is the content","date":"2020-10-08T14:11:11.000+00:00","product":{"id":2,"productName":"Android mobile","description":"description","salary":3000,"articles":[{"id":2,"articleName":"About Android 

То есть данные по циклу отображают друг друга. Как исправить это? Многое, что перепробовал. Если убрать mappedBy, то в JSON формате Product поле articles всегда пустое. А в JSON формате Article поле proudct всегда отображается. А мне нужно наоборот.


Ответы (1 шт):

Автор решения: tequillaz

Варианты решений на выбор:

  1. Убрать в Article ссылку на Product;
  2. Использовать JsonIgnore/JsonView для сокрытия Article.product: сериализатор проигнорирует данное поле при сериализации данных;
  3. Написать dto с необходимым представлением данных и конверторы entity -> dto, в dto реализовать корректную модель parent-child ссылок;

С моей точки зрения наиболее предпочтителен последний вариант, т.к. за счет дополнительного слоя представления данных появляется гибкая возможность развивать представления данных на разных слоях независимо друг от друга. Меньше связаны руки, меньше side-эффектов

→ Ссылка