小编Edv*_*yse的帖子

加载没有N + 1 Cartesian Product with JPA和Hibernate的递归对象图

将项目从Ibatis转换为JPA 2.1时,我遇到了一个问题,我必须为一组对象加载一个完整的对象图,而不是出于性能原因而没有按N + 1选择或使用笛卡尔积.

用户查询将产生List <Task>,我需要确保在返回任务时,它们已填充所有属性,包括,,依赖项属性.首先让我解释一下所涉及的两个实体对象.

任务是层次结构的一部分.它可以有一个父任务,也可以有子.任务可以依赖于其他任务,由'dependencies'属性表示.任务可以有许多属性,由properties属性表示.

尽可能简化了示例对象,并删除了样板代码.

@Entity
public class Task {
    @Id
    private Long id;

    @ManyToOne(fetch = LAZY)
    private Task parent;

    @ManyToOne(fetch = LAZY)
    private Task root;

    @OneToMany(mappedBy = "task")
    private List<TaskProperty> properties;

    @ManyToMany
    @JoinTable(name = "task_dependency", inverseJoinColumns = { @JoinColumn(name = "depends_on")})
    private List<Task> dependencies;

    @OneToMany(mappedBy = "parent")
    private List<Task> children;
}

@Entity
public class TaskPropertyValue {
    @Id
    private Long id;

    @ManyToOne(fetch = LAZY)
    private Task task; …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa lazy-loading java-ee-7

16
推荐指数
1
解决办法
6129
查看次数

标签 统计

hibernate ×1

java ×1

java-ee-7 ×1

jpa ×1

lazy-loading ×1