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/

【讨论】:

您能否更详细地解释一下 Lomboks toString 方法是如何导致问题的?我一直在使用@Data,没有遇到过这样的问题。 添加在为什么部分。

以上是关于JPA 未获取数据引发 *** 错误的主要内容,如果未能解决你的问题,请参考以下文章

当在命令行中未指定配置文件时,Spring Boot 集成测试无法获取默认配置文件并引发错误

为啥使用 axios 从 XML 中获取数据会引发 cors 错误? [复制]

从数据库获取数据时,Jpa Repository 出错无法序列化

无法读取未定义的属性“获取”

使用 Apollo-Client 重新获取查询会引发错误

通过 JPA 标准查询从 SQL 视图获取列表时出错