【问题标题】:Spring Data JPA @OneToManySpring Data JPA @OneToMany
【发布时间】:2019-05-17 17:40:08
【问题描述】:

我正在设计数据库的模型:

@Entity
@Table(name="t_urna")
public class Urna implements Serializable {


    @OneToMany(mappedBy = "urna", 
               cascade = CascadeType.ALL, 
               orphanRemoval = true, fetch = FetchType.EAGER)
    @JsonIgnore
    private Set<Vot> vots = new HashSet<>();

..
}


@Entity
@Table(name="t_vot")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Vot implements Serializable {

   @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "urna_id")
    @JsonIgnore
    Urna urna;

}

我想知道在这两个类中设置 FetchType.EAGER 是否会导致问题,例如一个永远结束的循环或一些堆栈溢出......以及这是否是一个好习惯

【问题讨论】:

  • This 应该有帮助...
  • 您不会遇到循环问题。但 EAGER 获取的是 code smell。我不建议在任何情况下使用它。

标签: spring hibernate spring-mvc spring-data-jpa spring-data


【解决方案1】:

不,你不会有一个永无止境的循环。

我认为在这个级别上没有好的或坏的做法。有时最好使用 LAZY,因为它会阻止您加载不需要的对象。有时最好使用 EAGER,因为如果您需要对象,它会阻止 hibernate 运行多个请求。

在编写微服务时,我总是使用 EAGER(以及有界上下文聚合)。对于单体来说,也许 LAZY 更聪明。

【讨论】:

    【解决方案2】:

    @ManyToOne 的默认获取类型无论如何都是EAGER。如果您将其设置在@OneToMany 上,则不应导致堆栈溢出。

    如果这是一个好习惯?我不会说是,但有时您还需要获取相关实体。但我会说最好指定entity graph

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 2021-02-10
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      相关资源
      最近更新 更多