【问题标题】:JPA avoid child collection initialization if empty如果为空,JPA 避免子集合初始化
【发布时间】:2021-02-27 14:06:21
【问题描述】:

假设我们有以下实体:

@Entity
@Table(name="parent")
class Parent {
    @OneToMany(fetchType=FetchType.Lazy,cascade=[CascadeType.ALL])
    val childs: List<Child>
}

@Entity
@Table(name="child")
class Child {
    @ManyToOne(fetchType=FetchType.LAZY)
    val parent: Parent
}

我现在想避免,hibernate 在我第一次调用时会获取数据库

parent.childs.addAll(childs)

因为我知道这个集合是空的。有没有办法告诉 JPA/Hibernate 它不需要进行 db fetch?

【问题讨论】:

  • 你怎么知道这个集合是空的?是新创建的实体吗?
  • 是的,但是由于某些情况我无法在创建父级时添加子级,所以我必须先添加父级,然后再添加子级。
  • 这是一个假设,稍后在创建Parent 时第二个机制插入条目时可能会失效,SQL 查询是否如此昂贵?
  • 这似乎很昂贵,他需要延迟初始化 200 个子集合(这对我的操作来说是正常的)长达 10 秒,这是不可接受的。所以我正在寻找优化方法,跳过这个初始化似乎是这里最好的方法......
  • 当然你也可以直接创建Child而不将它们添加到childs集合中,如果有帮助的话,之后保存Parent

标签: spring hibernate kotlin spring-data-jpa


【解决方案1】:

没有办法解决这个问题。只坚持孩子不是一种解决方法,这很好。如果具有 200 个元素的单个集合的延迟初始化需要 10 秒,那么您的数据库设置有问题。也许您缺少 FK 列上的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多