【发布时间】:2022-04-15 20:05:35
【问题描述】:
我正在使用 2 个表:Person 和 City。我有一个很好的@ManyToOne 关系。 (许多人可以属于一个城市)。 然后我需要创建一个父子关系。 (一个人可以是另一个人的父母)。代码:
@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;
[...]
}
这段代码编译,我让hibernate创建表,我可以看到parent_id列。
但是,在我插入几行并运行 myRepository.findAll() 后,我得到以下信息:
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)
即使在调试中检查结果,它也会返回 StackOverFlow 错误,但子父映射已正确完成。即使从父级我可以检查/扩展子级,然后扩展父级等等......
与@OneToOne 在同一类中的示例取自here。 关于如何解决这个问题的任何想法?
【问题讨论】:
-
我假设有些东西试图生成 toString 表示,其中所有属性都被字符串化,这导致 toString 从父级到子级到父级到父级到子级的无限循环,依此类推。您在 findAll 或使用 lombok 之后有一些后期处理吗?还是直接调用
repository.findAll() -
您是否将
@Data添加到Person或包含自定义(可能是自动生成的)toString? -
是的。我正在使用龙目岛。没有它会尝试
标签: java hibernate spring-data-jpa spring-data