JPA 未获取数据引发 *** 错误
Posted
技术标签:
【中文标题】JPA 未获取数据引发 *** 错误【英文标题】:JPA not fetching data throwing *** error 【发布时间】:2018-08-20 04:12:17 【问题描述】:我有一个非常大的 json 来存储,我把它分成以下五个实体并尝试使用 spring-data-jpa 存储到 h2 数据库中,插入到数据库中工作正常,但是在获取具有主键 ID 的对象时,我收到***错误,因为存在循环依赖。
谁能帮我找出问题所在。
***
@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】:我也遇到了同样的问题,花了一整天的时间。最后,我发现它的问题在于Lombok使用@Data
注解生成的toString
方法。
解决方案:
覆盖toString
方法并编写您自己的实现。如果您不想使用toString
,请使用@Getter
和@Setter
而不是@Data
。
为什么
注意:这发生在双向关系中。 假设我有两个实体并且具有双向关系。
@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() + ")";
在上面的示例中,Entity1 的 toString()(由 JPA 调用)调用 Entity2 的 toString()
和 Entity2 的 toString()
调用 Entity1 的 toString()
。这就是循环引用的构建方式。
注意:hashCode
方法也是如此。
这里有一些参考链接,
https://github.com/rzwitserloot/lombok/issues/1007
https://interviewbubble.com/***-tostring-method-when-using-lombok/
【讨论】:
您能否更详细地解释一下 LombokstoString
方法是如何导致问题的?我一直在使用@Data
,没有遇到过这样的问题。
添加在为什么部分。以上是关于JPA 未获取数据引发 *** 错误的主要内容,如果未能解决你的问题,请参考以下文章
当在命令行中未指定配置文件时,Spring Boot 集成测试无法获取默认配置文件并引发错误
为啥使用 axios 从 XML 中获取数据会引发 cors 错误? [复制]