JPA未获取数据引发stackoverflow错误

时间:2018-08-20 04:12:17

标签: java hibernate spring-data-jpa h2

我要存储一个非常大的json,我将其分为以下五个实体,并尝试使用spring-data-jpa存储到h2数据库,插入在数据库中工作正常,但是在获取具有主键ID的对象时,我收到stackoverflow错误,因为存在循环依赖性。

有人可以帮我弄清楚问题出在什么地方。

顶级

@Entity
@Table(name = "a")
@Data
public class A{

@Id
@Column(name = "a_id")
private String id;

@Column
private String name;

@Column
private String name2;

@Column
private String name3;

@Column
private String name4;

@Column
private String name5;

@OneToMany(cascade = CascadeType.ALL,mappedBy = "a",fetch = 
FetchType.EAGER)
@JsonManagedReference
private List<B> b;
}

第二堂课

@Entity
@Table(name = "b")
@Data
public class B{

@Id
@Column(name = "bname")
private String bname;

@Column
private String bVersion;

@OneToMany(cascade = CascadeType.ALL,mappedBy = "b")
@JsonManagedReference
private List<C> cs;


@ManyToOne
@JoinColumn(name = "a_id")
@JsonBackReference
private A a;
}

第三堂课

@Entity
@Data
public class C{

@Id
@Column(name = "cname")
private String cName;


@Column
private String cVersion;

@OneToMany(cascade = CascadeType.ALL,mappedBy = "c")
@JsonManagedReference
private List<D> ds;

@ManyToOne
@JoinColumn(name = "bname")
@JsonBackReference
private B b;
}

第四堂课

@Entity
@Data
public class D{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="d_id")
private long id;

@Column
private String dName;

@Column
private String dName2;


@ElementCollection
@Column
private List<String> dNames;


@OneToMany(cascade = CascadeType.ALL,mappedBy = "d")
@JsonManagedReference
private List<E> e;

@ManyToOne
@JoinColumn(name = "cname")
@JsonBackReference
private C c;

}

Fifth class

@Entity
@Data
public class E{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "e_id")
private long id;

@Column
private String ename;

@Column
private String eName2;


@ManyToOne
@JoinColumn(name = "e_id")
@JsonBackReference
private E e;
}

1 个答案:

答案 0 :(得分:2)

我也面临着同样的问题,并且整整度过了一天。最终,我发现Lombok使用mvn clean install注释生成的toString方法存在问题。

解决方案:

重写@Data方法并编写您自己的实现。如果您不想使用toString,请使用toString@Getter而不是@Setter

为什么

注意:这是双向关系。 可以说我有两个实体并且具有双向关系。

@Data

在上面的示例中,Entity1的toString()(由JPA调用)调用Entity2的@data Entity1{ @oneToMany public List<Entity2> entity2s; //Added by lombok while using @Data @Generated public String toString() { return "entity2s=" + this.getEntity2s() + ")"; } } @data Entity2{ @ManytoOne public Entity1 entity1; //Added by lombok while using @Data @Generated public String toString() { return "entity1=" + this.getEntity1() + ")"; } } ,而Entity2的toString()调用Entity1的toString()。这就是建立循环引用的方式。

注意:toString()方法也是如此。

这是一些参考链接,

https://github.com/rzwitserloot/lombok/issues/1007

https://interviewbubble.com/stackoverflow-tostring-method-when-using-lombok/