不正确的列表 @OneToMany 和 @ManyToOne Jpa

Not correct list @OneToMany and @ManyToOne Jpa

我正在尝试列出从 child(Person/Person) 到 parent(Company/Company).

以前它有无限循环问题,但是 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 修好了。

代码如下:

Empresa.class

package com.demo.clase7.Entity;

import com.fasterxml.jackson.annotation.*;
import com.sun.istack.NotNull;
import lombok.*;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Set;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "empresa")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Empresa {

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

    @Column(name = "razon_social")
    private String razonSocial;

    private String ruc, representante;

    @Column(name = "fecha_creacion")
    private Date fechaCreacion;

    @OneToMany(mappedBy = "empresa", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Persona> personaList;
}

Persona.class

package com.demo.clase7.Entity;

import com.demo.clase7.Entity.Empresa;

import com.fasterxml.jackson.annotation.*;
import lombok.*;

import javax.persistence.*;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "persona")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Persona {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nombre, email, direccion, telefono;

    @ManyToOne()
    @JoinColumn(name = "empresa_id")
    private Empresa empresa;
}

所以当列出 Empresa(公司)时,它给了我这个结果,这是正确的

[
    {
        "id": 1,
        "razonSocial": "oswaldo",
        "ruc": "23aaasd2424",
        "representante": "silviopd222",
        "fechaCreacion": "1995-01-01T00:00:00.000+00:00",
        "personaList": [
            {
                "id": 4,
                "nombre": "oswal peña diaz",
                "email": "pedi@gmail.com",
                "direccion": "las viñas 149",
                "telefono": "234982734",
                "empresa": 1
            },
            {
                "id": 5,
                "nombre": "oswal peña diaz",
                "email": "pedi@gmail.com",
                "direccion": "las viñas 149",
                "telefono": "234982734",
                "empresa": 1
            }
        ]
    },
    {
        "id": 2,
        "razonSocial": "oswaldo",
        "ruc": "23aaasd2424",
        "representante": null,
        "fechaCreacion": null,
        "personaList": []
    },
    {
        "id": 4,
        "razonSocial": "silviopd",
        "ruc": "232424",
        "representante": "silviopd2",
        "fechaCreacion": "1992-01-01T00:00:00.000+00:00",
        "personaList": []
    }
]

所以当我列出 Persona(人)时,它给了我这个错误的结果。

如果你意识到数组是由数字组成的

[
    {
        "id": 1,
        "nombre": "oswal peña diaz",
        "email": "pedi@gmail.com",
        "direccion": "las viñas 149",
        "telefono": "234982734",
        "empresa": null
    },
    {
        "id": 4,
        "nombre": "oswal peña diaz",
        "email": "pedi@gmail.com",
        "direccion": "las viñas 149",
        "telefono": "234982734",
        "empresa": {
            "id": 1,
            "razonSocial": "oswaldo",
            "ruc": "23aaasd2424",
            "representante": "silviopd222",
            "fechaCreacion": "1995-01-01T00:00:00.000+00:00",
            "personaList": [
                4,
                {
                    "id": 5,
                    "nombre": "oswal peña diaz",
                    "email": "pedi@gmail.com",
                    "direccion": "las viñas 149",
                    "telefono": "234982734",
                    "empresa": 1
                }
            ]
        }
    },
    5
]

数据库

CREATE SCHEMA clase7;


CREATE TABLE clase7.empresa
(
    id             bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
    fecha_creacion datetime,
    razon_social   varchar(255),
    representante  varchar(255),
    ruc            varchar(255)
) ENGINE = InnoDB
  AUTO_INCREMENT = 5
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE clase7.persona
(
    id              bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
    direccion       varchar(255),
    email           varchar(255),
    nombre          varchar(255),
    telefono        varchar(255),
    empresa_id      bigint,
    id_persona      bigint NOT NULL,
    persona_list_id bigint
) ENGINE = InnoDB
  AUTO_INCREMENT = 6
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE clase7.rol
(
    id     bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nombre varchar(255)
) ENGINE = InnoDB
  AUTO_INCREMENT = 5
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE clase7.usuario
(
    id          bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
    password    varchar(255),
    username    varchar(255),
    empleado_id bigint
) ENGINE = InnoDB
  AUTO_INCREMENT = 5
  DEFAULT CHARSET = utf8mb4;

CREATE INDEX `FKrvl5v1dpvx13a46b6wxo0qx0j` ON clase7.persona (empresa_id);

CREATE INDEX `FKgot3jq0eng9lvyja174qoe1a5` ON clase7.persona (persona_list_id);

CREATE INDEX `FK44o5rsj3cs2hsw2gkg3056ivm` ON clase7.usuario (empleado_id);

CREATE INDEX `FK3hkcdmd3tnvqg683r4cf0mgpn` ON clase7.empresa_persona_list (empresa_id);

ALTER TABLE clase7.empresa_persona_list
    ADD CONSTRAINT `FK3hkcdmd3tnvqg683r4cf0mgpn` FOREIGN KEY (empresa_id) REFERENCES clase7.empresa (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE clase7.empresa_persona_list
    ADD CONSTRAINT `FK90f46adsww2o9oq1gf4100wdd` FOREIGN KEY (persona_list_id) REFERENCES clase7.persona (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE clase7.persona
    ADD CONSTRAINT `FKgot3jq0eng9lvyja174qoe1a5` FOREIGN KEY (persona_list_id) REFERENCES clase7.empresa (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE clase7.persona
    ADD CONSTRAINT `FKrvl5v1dpvx13a46b6wxo0qx0j` FOREIGN KEY (empresa_id) REFERENCES clase7.empresa (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE clase7.usuario
    ADD CONSTRAINT `FK44o5rsj3cs2hsw2gkg3056ivm` FOREIGN KEY (empleado_id) REFERENCES clase7.persona (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

INSERT INTO clase7.empresa(id, fecha_creacion, razon_social, representante, ruc)
VALUES (1, '1994-12-31', 'oswaldo', 'silviopd222', '23aaasd2424');
INSERT INTO clase7.empresa(id, fecha_creacion, razon_social, representante, ruc)
VALUES (2, null, 'oswaldo', null, '23aaasd2424');
INSERT INTO clase7.empresa(id, fecha_creacion, razon_social, representante, ruc)
VALUES (4, '1991-12-31', 'silviopd', 'silviopd2', '232424');
INSERT INTO clase7.persona(id, direccion, email, nombre, telefono, empresa_id, id_persona, persona_list_id)
VALUES (1, 'las viñas 149', 'pedi@gmail.com', 'oswal peña diaz', '234982734', null, 0, null);
INSERT INTO clase7.persona(id, direccion, email, nombre, telefono, empresa_id, id_persona, persona_list_id)
VALUES (4, 'las viñas 149', 'pedi@gmail.com', 'oswal peña diaz', '234982734', 1, 0, null);
INSERT INTO clase7.persona(id, direccion, email, nombre, telefono, empresa_id, id_persona, persona_list_id)
VALUES (5, 'las viñas 149', 'pedi@gmail.com', 'oswal peña diaz', '234982734', 1, 0, null);
INSERT INTO clase7.rol(id, nombre)
VALUES (1, 'silviopd2');
INSERT INTO clase7.rol(id, nombre)
VALUES (2, 'oswal');
INSERT INTO clase7.rol(id, nombre)
VALUES (4, 'silviopd2');
INSERT INTO clase7.usuario(id, password, username, empleado_id)
VALUES (1, '232424', 'oswal', null);
INSERT INTO clase7.usuario(id, password, username, empleado_id)
VALUES (2, '232424ss', 'silviopd2', 1);
INSERT INTO clase7.usuario(id, password, username, empleado_id)
VALUES (4, '232424ss', 'silviopd2', 4);

我找到了解决方案,显然是代码 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 允许我不要生成无限循环,但是当从 person 列出时,它并没有很好地列出。

在 Persona.class 中找到的“company”对象生成的按公司列出时存在无限循环,同时在列表生成的列出人员时存在无限循环Empresa.class.

中的“personList”

要解决这两个循环,请执行以下操作:

对于 Empresa class 我们添加 @JsonIgnoreProperties("empresa")

对于角色 class 我们添加 @JsonIgnoreProperties("personaList")

我在这里留下最终代码

实体

Persona.class

package com.demo.clase7.Entity;


import com.fasterxml.jackson.annotation.*;
import lombok.*;

import javax.persistence.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "persona")
//@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Persona {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nombre, email, direccion, telefono;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "empresa_id", referencedColumnName = "id")
    @JsonIgnoreProperties("personaList")
    private Empresa empresa;

}

Empresa.class

package com.demo.clase7.Entity;

import com.fasterxml.jackson.annotation.*;
import lombok.*;

import javax.persistence.*;
import java.util.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "empresa")
//@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Empresa {

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

    @Column(name = "razon_social")
    private String razonSocial;

    private String ruc, representante;

    @Column(name = "fecha_creacion")
    private Date fechaCreacion;

    @OneToMany(mappedBy = "empresa")
    @JsonIgnoreProperties("empresa")
    private List<Persona> personaList;
}