不正确的列表 @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;
}
我正在尝试列出从 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;
}