Spring JPA双向无法评估toString

时间:2016-10-26 15:50:07

标签: hibernate spring-data-jpa

我已经使用@JsonIdentityInfo解析了JSON递归循环到Baeldung的博客1(谢谢)

但现在又出现了另一个错误:

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.mezoo.tdc.model.Payment.toString()

这是我的注册对象:

    @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();
         }
    }

现在,付款对象:

    @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();
       }
    }

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

debug screenshot

请问,有什么不对,为什么?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

删除toString方法。

如果您使用的是龙目岛:

使用 lombok 中的@Data注释检查您的实体/ DAO类,默认情况下,该注释包括getter和setter。如有需要,请将其更改为@Getters@Setter,并删除@Data 注释。

答案 2 :(得分:0)

在您的Registration.toString()中,您呼叫Payment.toString();在您的Payment.toString()中,您呼叫Registration.toString()

您已经在toString中创建了一个循环

  @Override
  public String toString() {
     return MoreObjects.toStringHelper(this)
        .add("payment", payment) //<----------- REMOVE THIS
        .toString();
  }

   @Override
   public String toString() {
   return MoreObjects.toStringHelper(this)
        .add("registration", registration) //<----------- REMOVE THIS
        .toString();
   }

或更妙的是,将它们都删除