В Spirngboot я использую JpaRepository, когда получаю любую запись из одной таблицы, связанную с другой записью таблицы, в этом случае я получаю рекурсивные данные. Например, у меня есть две таблицы (работы и компания), у рабочих мест есть поле компании в объекте, у компании есть поле рабочих мест, установленное в объекте компании.
это образец моего ответа
Здесь моя сущность «Работа»
@Entity
public class Jobs {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String title;
@ManyToOne( fetch = FetchType.LAZY)
@JoinColumn(name = "company")
private Company company;
..,
Компания
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false, unique = true)
private String name;
@Column(length = 1500)
private String about;
@Column( length = 600)
private String companyLogoLink;
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Jobs> jobs;
..,
Я уже опробовал Lazy Loader в аннотации
Я ожидаю, когда сохраню любую новую запись о вакансиях. его возвратная работа и связанная с ней запись о компании, а не запись о работе, связанная с компанией. нравиться
job{
id:
title:
company: {
id:
company_name:
jobs: {
avoid here repeated;
}
При ленивой выборке данные извлекаются из базы данных по требованию при вызове метода получения.
Джексон по умолчанию использует геттеры/сеттеры для сериализации/десериализации. Когда он вызывает геттер, jpa извлекает данные, затем он вызывает геттер для новых данных при их сериализации, jpa извлекает дополнительные данные и так далее. Я удивлен, что вы не получаете здесь ошибку stackoverflow, формат json не может представлять циклические ссылки между объектами, которые абсолютно законны в Java.
Решения:
@JsonIgnore
на свойства, которые вам не нужны.@JsonIdentityInfo
и другие аннотации Джексона, которые могут иметь дело с циклическими ссылками.Я полагаю, что вы ищете ответ, как показано ниже, поэтому вам нужно сделать 2 изменения в обоих классах Pojo.
Замените переменную вашей компании приведенным ниже кодом в Jobs Pojo.
@JoinColumn(name = "company")
@ManyToOne(optional=false)
@JoinColumn(name = "company", referencedColumnName = "id", nullable=false)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
private Company company;
Удалите приведенный ниже код из компании Pojo.
@OneToMany(mappedBy = "company")
private Set<Jobs> jobs;
[
{
"id": 1,
"title": "Job 1",
"company": {
"id": 1,
"name": "name 1",
"about": "About 1",
"companyLogoLink": "link 1",
"jobs": [
{
"id": 2,
"title": "Job 2",
"company": 1
},
{
"id": 1,
"title": "Job 1",
"company": 1
}
]
}
}
]
Но мне также нужен этот Set<Jobs> в сущности Company, когда я получаю объект компании, который также связан с заданиями, которые мне нужны.
Вместо
JsonIgnore
я бы использовал специальную пару аннотаций:JsonManagedReference
иJsonBackReference
.