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