Hibernate连接两个实体

时间:2018-01-09 17:33:36

标签: spring hibernate web-services spring-boot entity

我真的不知道我的问题究竟是什么。

我的项目中有两个模型。

模型封装

  • Ansprechpartner
  • Lieferant

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;

3 个答案:

答案 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以进行查看