【问题标题】:Hibernate join two entitiesHibernate 加入两个实体
【发布时间】:2018-06-18 19:35:23
【问题描述】:

我真的不知道我的问题到底是什么。

我的项目中有两个模型。

模型包

  • Ansprechpartner
  • 中尉

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 数据时,我遇到了以下问题。 AnsprechpartnerLieferant 获取数据(因为该联接)。但随后 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;

【问题讨论】:

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


    【解决方案1】:

    为了避免无限递归,您可以使用 @JsonManagedReference 和 @JsonBackReference Json 无限递归是我们序列化具有双向关系的 Java 对象时最常见的问题之一。

    @JsonManagedReference:带有注解的部分会被正常序列化。 @JsonBackReference: 带有注解的部分将从序列化中省略。

    喜欢:

       @JsonBackReference
       private Set<Ansprechpartner> apart;
    

    您可以在solution-2查看详情

    【讨论】:

    • 还有其他方法吗?因为,如果我想访问 Lieferanten 下的所有 Ansprechpartner,这是不可能的。我仍然想要那个双向的,但不是递归。
    • 是的,它是双向的,你必须在 Lieferant.java 中添加 @JsonBackReference private Set&lt;Ansprechpartner&gt; apart @Ansprechpartner.java 中的 @JsonManagedReference private Lieferanten liefCode;
    • 嗨 mjsoft,我试过了...它适用于 Ansprechpartner。我得到了 Ansprechpartner 的数据 + Lieferanten 的相关数据(没有递归)。但是如果我尝试获取 Lieferanten 的数据,我不会得到 Ansprechpartner 的相关数据。 “分开”字段被完全忽略。它在一个方向上起作用,但不是在两个方向上:/
    • 你能给我看看你的pojo吗
    • 我用 JsonIgnoreProperties 解决了我的问题。我注释掉了 JsonBackReference 和 JsonManagedReference,但它仍然在代码中。我已经编辑了上面的问题。
    【解决方案2】:

    奇怪的行为。或许你可以试试:

    1) 确保在Lieferanten 实体中,在equals / hashCode 中不要使用Set&lt;Ansprechpartner&gt; 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;
    }
    

    您需要在存储库中实现一点 -> link,以使其可用。

    3) 显式添加延迟加载:@OneToMany(mappedBy = "liefCode", fetch = FetchType.LAZY)

    【讨论】:

      【解决方案3】:

      根本原因是当对象具有双向关系时杰克逊试图序列化对象。 您可以通过这种方式修复它 Short way

      更好的方法: 将实体直接返回到视图层不是一个好习惯。 您应该将实体转换为 DTO (Data Transfer Object) 并将 DTO 传递给查看

      【讨论】:

      • 您的第一个解决方案:还有其他方法吗?因为,如果我想访问 Lieferanten 下的所有 Ansprechpartner,这是不可能的。我仍然想要那个双向的,但不是递归。更好的方法:我会尝试的。
      • 您是否尝试将@JsonIgnore 添加到属性“liefCode”(Ansprechpartner.java)?
      • 我用 JsonIgnoreProperties 解决了我的问题。只是@JsonIgnore 对我没有帮助
      猜你喜欢
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2017-09-29
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多