我要存储一个非常大的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;
}
答案 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/