在Spirngboot中,当我从一个表中获取与另一个表记录关联的任何记录时,我使用了JpaRepository,在这种情况下我得到了递归数据。 例如我有两个表(工作和公司),工作在实体上有公司字段,公司在公司实体上有工作字段设置。
这是我的工作实体
@Entity
public class Jobs {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String title;
@ManyToOne( fetch = FetchType.LAZY)
@JoinColumn(name = "company")
private Company company;
..,
公司实体
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false, unique = true)
private String name;
@Column(length = 1500)
private String about;
@Column( length = 600)
private String companyLogoLink;
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Jobs> jobs;
..,
我已经在注释处尝试过Lazy loader
我预计当我保存任何新的工作记录时。其返回工作和关联公司记录不是与公司关联的工作记录。 喜欢
job{
id:
title:
company: {
id:
company_name:
jobs: {
avoid here repeated;
}
当您延迟获取时,当调用 getter 时,会按需从数据库检索数据。
Jackson 默认使用 getter/setter 进行序列化/反序列化。当它调用 getter 时,jpa 检索数据,然后在序列化新数据时调用 getter,jpa 检索更多数据,依此类推。我很惊讶你在这里没有收到 stackoverflow 错误,json 格式不能表示对象之间的循环引用,这在 java 中是绝对合法的。
解决方案:
@JsonIgnore
关于您不需要的属性。@JsonIdentityInfo
等jackson注解,可以处理循环引用。