【问题标题】:JPA Criteria API recursive fetch lazy associationJPA Criteria API 递归获取延迟关联
【发布时间】:2019-01-23 11:30:17
【问题描述】:

我有一个与自身有关联的递归实体。

@Entity
public class Function {
    (...)

    @ManyToMany(fetch = FetchType.LAZY)
    private Set<Function> children = new HashSet<>();
}

如果这个关联是急切的@ManyToMany(fetch = FetchType.EAGER),那么它的所有孩子总是会在一次访问数据库时被初始化。当然,我不希望这个协会急于求成。

使用 JPA Criteria API,可以使用someRoot.fetch(Function_.children) 获取集合。但这只会获取一层深度,并且不像 Eager fetch 类型那样递归。

有没有一种方法可以递归地获取它的孩子而不使其成为一个急切的关联?

【问题讨论】:

  • 无论你想要它是懒惰的还是渴望的,没有第三种类型的 Eager-on-lazy-init
  • @XtremeBaumer 没有配置它,所以它仍然是它的默认值。这对我有什么帮助?
  • 如果访问“第二”层,究竟会发生什么?它仍然应该为实体补水
  • @XtremeBaumer 是的,它会,但我试图避免额外的数据库调用。

标签: java hibernate jpa criteria hibernate-criteria


【解决方案1】:

我选择为同一个表进行多个映射。这有一些危险,但由于实体是短暂的,并且只有其中一个需要是可写的,所以没关系。

在我的例子中,其中一个甚至不需要访问它的孩子,进一步简化了我的这个实体。

@MappedSuperclass
public class BaseFunction {
    (...)
}
@Entity
@Table(name = "function")
public class RecursiveFunction extends BaseFunction {

    @ManyToMany(fetch = FetchType.EAGER)
    private Set<RecursiveFunction> children = new HashSet<>();
}
@Entity
@Table(name = "function")
public class SimpleFunction extends BaseFunction {}

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多