Я хочу знать, почему мой контроллер дает вложенный ответ

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

Ответы 2

Ответ принят как подходящий

При ленивой выборке данные извлекаются из базы данных по требованию при вызове метода получения.

Джексон по умолчанию использует геттеры/сеттеры для сериализации/десериализации. Когда он вызывает геттер, jpa извлекает данные, затем он вызывает геттер для новых данных при их сериализации, jpa извлекает дополнительные данные и так далее. Я удивлен, что вы не получаете здесь ошибку stackoverflow, формат json не может представлять циклические ссылки между объектами, которые абсолютно законны в Java.

Решения:

  1. Используйте хорошие практики - для де/сериализации используйте DTO (объекты передачи данных), а не сущности (что является плохой практикой).
  2. @JsonIgnore на свойства, которые вам не нужны.
  3. @JsonIdentityInfo и другие аннотации Джексона, которые могут иметь дело с циклическими ссылками.

Вместо JsonIgnore я бы использовал специальную пару аннотаций: JsonManagedReference и JsonBackReference.

Mar-Z 11.05.2024 09:13

Я полагаю, что вы ищете ответ, как показано ниже, поэтому вам нужно сделать 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, когда я получаю объект компании, который также связан с заданиями, которые мне нужны.

Saravanan 13.05.2024 09:24

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

Лучшая практика написания модульного теста пользовательской реализации Spring ApplicationRunner и передачи в нее вариантов ApplicationArguments
Невозможно подключиться к автономной базе данных Oracle с помощью Springboot и кошелька TNS
SpringBoot – мой проект использует базу данных в памяти, и я не знаю, как прекратить это делать и перейти на настоящую постоянную базу данных
Как получить объект фактического типа с помощью универсального класса?
Spring boot: определение собственного метода в модели домена
Перемещение файла из контейнера BLOB-объектов Azure в общий файловый ресурс Azure в приложении Springboot
Spring boot 401 Неавторизованный при почтовом запросе аутентификации
Как получить дочерние элементы родителя в Hibernate?
Hibernate/JPA: Как правильно моделировать однонаправленные отношения @ManyToMany для операций CRUD?
Dockerfile для gradle, приложения весенней загрузки с использованием многоэтапного