【问题标题】:EntityGraph or Join Fetch with Inheritance in JPA/HibernateJPA/Hibernate 中的 EntityGraph 或 Join Fetch 继承
【发布时间】:2020-11-10 16:10:39
【问题描述】:

我正在使用 JpaRepositories 处理 JPA/Hibernate 实体。我很少有具有@OneToOne@OneToMany 关系的实体。为了使代码简洁明了,我将实体命名为 A、B、C、D 等。A 是根实体,在链下是带有连接策略的继承。请看下面的代码-

A.java

@Entity
@Table(name = "A")
public class A {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long aId;

    @Column
    private String name;

    @OneToOne
    @JoinColumn(name = "bId")
    private B b;

    @OneToMany(mappedBy = "a")
    private Set<C> cSet;
    
    // other entity specific fields
    // getters and setters
}

B.java

@Entity
@Table(name = "B")
public class B {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long bId;

    // other entity specific fields
    // getters and setters
}

C.java

@Entity
@Table(name = "C")
public class C {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long cId;

    @ManyToOne
    @JoinColumn(name = "aId", referencedColumnName = "aId")
    private A a;

    @OneToMany(mappedBy = "c")
    private Set<D> dSet;

    // other entity specific fields
    // getters and setters
}

D.java

@Entity
@Table(name = "D")
@Inheritance(strategy = InheritanceType.JOINED)
public class D {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long dId;

    @ManyToOne
    @JoinColumn(name = "cId", referencedColumnName = "cId")
    private C c;

    @OneToMany(mappedBy = "d")
    private Set<E> eSet;

    // other entity specific fields
    // getters and setters

}

E.java

@Entity
@Table(name = "E")
public class E {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long eId;

    @ManyToOne
    @JoinColumn(name = "dId", referencedColumnName = "dId")
    private D d;

    // other entity specific fields
    // getters and setters
}

F.java

@Entity
@Table(name = "F")
public class F extends D {

    @OneToMany(mappedBy = "d")
    private Set<H> hSet;

    // other entity specific fields
    // getters and setters
}

G.java

@Entity
@Table(name = "G")
public class G extends D {

    @OneToMany(mappedBy = "d")
    private Set<I> iSet;

    // other entity specific fields
    // getters and setters
}

H.java

@Entity
@Table(name = "H")
public class H {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long hId;

    @ManyToOne
    @JoinColumn(name = "dId", referencedColumnName = "dId")
    private D d;

    // other entity specific fields
    // getters and setters
}

I.java

@Entity
@Table(name = "I")
public class I {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long iId;

    @ManyToOne
    @JoinColumn(name = "dId", referencedColumnName = "dId")
    private D d;

    // other entity specific fields
    // getters and setters
}

如果您看到继承从作为父实体 D 开始,G 和 F 扩展 D。我需要通过 EnityGraph 或 Join fetch 获取所有实体。所有的协会都是懒惰的。我有根 A 的 id。当我调用 ...aRepository.findById(aId);

我尝试了许多解决方案,但无法获取。创建 EntityGraph 的问题是实体链之间的继承。我能够获取的唯一方法是当我建立关联时 EAGER。我不想将@OneToMany 映射为 EAGER。

谁能建议我一个解决方案(@EntityGraph 或加入 Fetch)来执行此任务?

【问题讨论】:

标签: java spring-boot hibernate jpa spring-data-jpa


【解决方案1】:

这似乎与这里的问题非常相似:https://stackoverflow.com/a/61272573/412446

我认为您可以推断出实体图不能用于此目的。如果你愿意,你可以使用 join fetch,但我认为 Spring Data JPA 存储库只能与实体图一起使用。你仍然可以使用Blaze-Persistence Entity-Views :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 2017-09-29
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多