我真的不知道我的问题究竟是什么。
我的项目中有两个模型。
模型封装
Ansprechpartner.java
@Entity
@Table(name = "ANSPRECHPARTNER")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"anlageAm", "updatedAt"}, allowGetters = true)
public class Ansprechpartner {
...
@NotNull
@ManyToOne
@JoinColumn(name = "lief_code", foreignKey=@ForeignKey(name = "APART_LIEF_FK"))
private Lieferanten liefCode;
public Lieferanten getLiefCode() {
return liefCode;
}
public void setLiefCode(Lieferanten liefCode) {
this.liefCode = liefCode;
}
...
}
Lieferant.java
@Entity
@Table(name = "LIEFERANTEN")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"anlageAm"}, allowGetters = true)
public class Lieferanten {
...
@Id
private String code;
@OneToMany(mappedBy = "liefCode")
private Set<Ansprechpartner> apart;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Set<Ansprechpartner> getApart() {
return apart;
}
public void setApart(Set<Ansprechpartner> apart) {
this.apart = apart;
}
...
}
我的控制器:
@RestController
@RequestMapping("/apart")
public class AnsprechpartnerController {
...
@GetMapping("/all/{id}")
public Ansprechpartner getApartWithId(@PathVariable("id") long id) {
Ansprechpartner apart = apartRepository.findOne(id);
return apartRepository.findOne(id);
}
}
当我尝试获取json数据时,我遇到以下问题。 Ansprechpartner 从 Lieferant 获取数据(因为该加入)。但是 Lieferant 再次显示来自 Ansprechpartner 的数据,依此类推。
可能用以下图片更好地描述: Image with explanation
修改
我终于用@JsonIgnoreProperties注释解决了它:
在我的Ansprechpartner.java中,我这样做了:
@NotNull
@JsonIgnoreProperties("apart")
// @JsonManagedReference
@ManyToOne
@JoinColumn(
name = "lief_code",
foreignKey=@ForeignKey(name = "APART_LIEF_FK")
)
private Lieferanten liefCode;
在我的Lieferanten.java中,我这样做了:
// @JsonBackReference
@JsonIgnoreProperties("liefCode")
@OneToMany(mappedBy = "liefCode", fetch = FetchType.LAZY)
private Set<Ansprechpartner> apart;
答案 0 :(得分:0)
奇怪的行为。可能你可以试试:
1)请确保在Lieferanten
实体的equals
/ hashCode
您不使用Set<Ansprechpartner> apart
。
2)您可以从持久性上下文中明确分离实体:
@NotNull
@ManyToOne
@JoinColumn(name = "lief_code"
, foreignKey=@ForeignKey(name = "APART_LIEF_FK")
, cascade={CascadeType.DETACH})
private Lieferanten liefCode;
然后在控制器中:
@GetMapping("/all/{id}")
public Ansprechpartner getApartWithId(@PathVariable("id") long id) {
Ansprechpartner apart = apartRepository.findOne(id);
apartRepository.detach(apart);
return apart;
}
你需要实现一点 - &gt; link,在存储库中,以使其可用。
3)明确添加延迟加载:@OneToMany(mappedBy = "liefCode", fetch = FetchType.LAZY)
。
答案 1 :(得分:0)
为避免无限递归,您可以使用@JsonManagedReference&amp; @JsonBackReference 当我们序列化具有双向关系的Java对象时,Json Infinite Recursion是最常见的问题之一。
@JsonManagedReference:
带注释的部件将正常序列化。
@JsonBackReference:
带有注释的部分将从序列化中省略。
像:
@JsonBackReference
private Set<Ansprechpartner> apart;
您可以查看solution-2
中的详细信息答案 2 :(得分:0)
根本原因是当对象具有双向关系时,jackson尝试序列化对象。 你可以通过这种方式修复它 Short way
更好的方式: 直接将实体返回到视图层不是一个好习惯。 您应该将实体转换为DTO(Data Transfer Object)并传递DTO以进行查看