Spring JPA双向无法评估toString

Mez*_*zoo 13 hibernate spring-data-jpa

我已经@JsonIdentityInfo通过Baeldung的博客1解决了JSON递归循环(谢谢)

但是现在,另一个错误发生了:

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.mezoo.tdc.model.Payment.toString()
Run Code Online (Sandbox Code Playgroud)

这是我的注册对象:

    @Entity
    @Table(name="Registration")
    @JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
    public class Registration implements Serializable {

       /*some private variables..*/

      // Bidirectional relationship
      @OneToMany(mappedBy="registration", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, fetch = FetchType.LAZY)
      private List<Payment> payment;

                @Override
      public String toString() {
         return MoreObjects.toStringHelper(this)
            .add("payment", payment)
            .toString();
         }
    }
Run Code Online (Sandbox Code Playgroud)

现在,付款对象:

    @Entity
    @Table(name="Payment")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
    public class Payment implements Serializable {
       @ManyToOne
       @JoinColumn(name = "registration")
       private Registration registration;

       @Override
       public String toString() {
       return MoreObjects.toStringHelper(this)
            .add("registration", registration)
            .toString();
       }
    }
Run Code Online (Sandbox Code Playgroud)

这就是我在调试器中看到的内容:

调试屏幕截图

拜托,怎么了?为什么?

Ris*_*wal 11

删除toString方法。

如果您使用的是龙目岛:

检查您可能正在使用lombok中的@Data注释的Entity / DAO类,该注释默认情况下包含getter和setter。更改为,以防万一,并删除注释。@Getters@Setter@Data

  • 您可以用“@ToString.Exclude”替换导致错误的区域,而不是更改“@Data”注释。 (8认同)
  • 我正在使用 @Data 注释并将其删除并将其更改为 _@Getters_ 和 _@Setters_ 并且它已修复。谢谢 (3认同)
  • 正是我要找的。 (2认同)

cri*_*zis 9

好吧,我的猜测是Registration.toString()打印列表中每笔付款Payment.toString()的字符串表示形式Registration,由于包含的字符串表示形式,Registration.toString()再次被调用,依次又被调用Payment.toString(),依此类推。

尝试返回一个空字符串Payment.toString()以查看问题是否消失。

  • 如果我理解正确的话,`@Data` 意味着 `@ToString`,它会抓取类的所有字段并将它们打印在 `toString()` 中。所以是的,很可能 `@Data` 是这里的问题。至于映射,除非你觉得你不需要双向关联,没有什么可以改进的,它是完全有效的。`toString()` 的生成方式导致了问题。 (2认同)