GOOGLE ADS

jueves, 21 de abril de 2022

Lombok - Hibernate @OneToOne en la misma clase - StackOverFlowError

Estoy trabajando con 2 tablas: Persona y Ciudad. Tengo una relación @ManyToOne que funcionó bien. (muchas personas pueden pertenecer a una ciudad). Entonces necesitaba crear una relación padre-hijo. (una persona puede ser padre de otra persona). El código:

@Entity
@Data
@Table(name="PERSON")
public class Person {
@Id
@Column(name="person_id")
private int id;
@OneToOne
@JoinColumn(name = "parent_id")
private Person parentPerson;
@OneToOne(mappedBy = "parentPerson")
private Person childPerson;
public Person() {
}
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "city_id", nullable = false)
private City city;
}
@Entity
@Data
@Table(name = "city")
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "city_id")
private Integer cityId;

[...]
}

Este código compila, dejo hibernar para crear la tabla y puedo ver la parent_idcolumna. Sin embargo, después de insertar algunas filas y ejecutar myRepository.findAll(), obtengo lo siguiente:

java.lang.StackOverflowError
at java.base/java.lang.Integer.toString(Integer.java:438)
at java.base/java.lang.Integer.toString(Integer.java:1165)
at java.base/java.lang.String.valueOf(String.java:2951)
at package.City.toString(City.java:15)
at java.base/java.lang.String.valueOf(String.java:2951)
at package.Person.toString(Person.java:16)
at java.base/java.lang.String.valueOf(String.java:2951)
at package.Person.toString(Person.java:16)
at java.base/java.lang.String.valueOf(String.java:2951)
[...]
at java.base/java.lang.String.valueOf(String.java:2951)
at package.Person.toString(Person.java:16)
at java.base/java.lang.String.valueOf(String.java:2951)

Incluso al inspeccionar el resultado en la depuración, devolvía el error StackOverFlow, pero las asignaciones entre padres e hijos se realizaron correctamente. Aunque desde el padre podría inspeccionar/expandir al hijo, luego expandir al padre y así sucesivamente...

El ejemplo con @OneToOne en la misma clase se toma de aquí. ¿Alguna idea sobre cómo puedo resolver el problema?


Solución del problema

Gracias @Daniel Wosch y @dan1st por las sugerencias. De hecho, el toString generado a partir de @Data de Lombok fue el problema. La solución fue usar @Getter, @Setter, @EqualsAndHashCode de Lombok y mi propio toString, que no hacía referencia tanto al padre como al hijo. Sólo uno de ellos y está bien.

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...