簡體   English   中英

JPA/Hibernate 中的 EntityGraph 或使用 Inheritance 加入 Fetch

[英]EntityGraph or Join Fetch with Inheritance in JPA/Hibernate

我正在使用 JpaRepositories 處理 JPA/Hibernate 實體。 我很少有具有@OneToOne@OneToMany關系的實體。 為了使代碼簡潔明了,我將實體命名為 A、B、C、D 等。A 是根實體,鏈下有 Inheritance 和 Joined 策略。 請看下面的代碼 -

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
}

如果您看到 inheritance 從作為父實體的實體 D 開始,G 和 F 擴展了 D。我需要通過 EnityGraph 或 Join fetch 獲取所有實體。 所有的協會都是懶惰的。 我有根 A 的 id。當我調用aRepository.findById(aId);

我嘗試了很多解決方案,但我無法獲取。 創建 EntityGraph 的問題是實體鏈之間的 inheritance。 我能夠獲取的唯一方法是當我建立關聯時 EAGER。 我不想將@OneToMany映射作為 EAGER。

誰能建議我執行此任務的解決方案( @EntityGraph或 Join Fetch)?

這似乎與這里的問題非常相似: https://stackoverflow.com/a/61272573/412446

我認為您可以推斷實體圖不能用於此目的。 如果您願意,您可以使用連接提取,但我認為 Spring 數據 JPA 存儲庫只能用於實體圖。 你仍然可以使用Blaze-Persistence Entity-Views :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM