【问题标题】:Lombok - Hibernate @OneToOne in same class - StackOverFlowErrorLombok - 在同一类中休眠@OneToOne - StackOverFlowError
【发布时间】: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


【解决方案1】:

感谢@Daniel Wosch 和@dan1st 的建议。 事实上,从 Lombok 的 @Data 生成的 toString 是问题所在。 解决方案是使用 Lombok 的 @Getter、@Setter、@EqualsAndHashCode 和我自己的 toString,它没有同时引用父子节点。只要其中一个就可以了。

【讨论】:

    【解决方案2】:

    另一种选择是在 Data 注释之后添加以下注释:@EqualsAndHashCode(callSuper = false,exclude="your relational properties") 只需将 exclude 的值替换为您的字段即可。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 2021-06-25
      • 2012-10-14
      • 2012-07-30
      • 2011-02-25
      • 2014-12-27
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多