2016-12-15 46 views
0

我有這樣的家長:JPA - 只有獲得父母,而不是孩子

@Entity 
@Table(name="parent") 
public class Parent { 

    private List<Child> childs; 
    private List<AnotherChild> anotherChilds; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    public List<Child> getChilds() { 
     return childs; 
    } 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    public List<AnotherChild> getAntoherChilds() { 
     return anotherChilds; 
    } 

    //Getters and Setters ommited 
} 

和兩個孩子這樣

@Entity 
@Table(name="child") 
public class Child { 

    private Parent parent; 

    @ManyToOne 
    @JoinColumn(name = "column_name") 
    public Parent getParent() { 
     return patern; 
    } 
} 

@Entity 
@Table(name="another_child") 
public class AnotherChild { 

    private Parent parent; 

    @ManyToOne 
    @JoinColumn(name = "column_name") 
    public Parent getParent() { 
     return patern; 
    } 
} 

我有一個名爲查詢它獲取所有的父母,但是這也正在加載所有的孩子?我怎樣才能阻止孩子自動加載?

謝謝。

+0

請發佈您的查詢,獲取父。 –

+0

@AbdullahWasi它只是標準的findAll查詢,並被稱爲表單JAX-RS作爲一個命名查詢 – iqueqiorio

+0

延遲加載是默認的,所以如果他們被加載,那麼它是你的代碼,它是這樣做的 - 所以發佈相關碼。 –

回答

0

延遲加載是計算機編程中常用的一種設計模式,用於推遲對象的初始化直到需要它的點。如果適當和適當地使用,它可以有助於程序運行的效率。延遲加載的對面是渴望加載

如何在Hibernate中

啓用延遲加載進一步移動之前,回顧一下在使用Hibernate映射VS註釋的情況下延遲加載的默認行爲 是很重要的。 默認行爲是加載「屬性值」並加載 '集合lazily'。相反,如果您之前有 使用普通Hibernate 2(映射文件),那麼所有引用 (包括集合)默認情況下都會被加載。另請注意, @OneToMany和@ManyToMany關聯默認爲LAZY加載; 和@OneToOne和@ManyToOne默認爲EAGER加載。這是 重要的是要記住在將來避免任何陷阱。要明確加載 ,必須在 關聯上使用「fetch = FetchType.LAZY」,當您使用hibernate 批註時,您希望延遲加載。一個示例用法如下所示:@OneToMany( mappedBy =「category」,fetch = FetchType.LAZY)private設置產品; 與「FetchType.LAZY」平行的另一個屬性是「FetchType.EAGER」 ,它與LAZY恰好相反,即當第一次獲取擁有者實體時,它將會將關聯實體加載爲 。懶惰加載如何在Hibernate中工作 Hibernate可以將延遲加載 行爲應用於您的實體和關聯的最簡單方法是通過提供代理 執行它們。 Hibernate通過 截取對實體的調用,用代理替代從實體類派生的實體。在缺少 請求的信息的情況下,在將控制權交給父實體實施之前,將從數據庫 加載它。請注意,當關聯被表示爲集合類時, 將創建一個包裝(實質上是集合的代理,而不是包含它所包含的實體的 ),並替換原始集合中的 。當你訪問這個集合代理時,你在返回的代理集合中得到的是什麼 不是代理實體;而不是他們是實際的實體。您不需要在理解這個概念上施加太大的壓力,因爲在運行時它幾乎不重要。

相關問題