2017-02-13 83 views
2

Hibernate的使用如何限制列5.0.10 我有一個子定義是這樣的:在一個Hibernate實體圖

@NamedSubgraph(name = "proc", attributeNodes = { @NamedAttributeNode("name"), @NamedAttributeNode("childTable1"), @NamedAttributeNode("childTable2"), @NamedAttributeNode("childTable3"), @NamedAttributeNode("childTable4") }),

的問題是,使用這個子圖的時候,我得到取回在根表(其中名稱存在)中定義的所有屬性,而不僅僅是指定的子圖屬性。有沒有辦法告訴hibernate不去取這些孩子?我的查詢看起來就像select rec from records rec join rec.proc

回答

2
  1. 如果你談論的是基本類型,那麼,在默認情況下,Hibernate總是會接他們。啓用基本類型延遲加載的唯一方法是使用字節碼增強,如this article中所述。
  2. 如果您正在談論EAGER關聯,那麼即使JPA標準認爲它應該,Hibernate也無法將它們重寫爲LAZY。

從JPA的角度來看,1.和2.都不是強制要求,因爲LAZY只是JPA提供者的提示。

總而言之,JPA實體圖是獲取數據的次優方式。 Avoiding EAGER associations,using subentities和DTO預測比實體圖好得多。

大多數情況下,您甚至不需要獲取實體,因爲實體只有在計劃修改時纔有意義。否則,DTO投影總是會更有效率。

+0

那麼在這種情況下,急切的加載只是問題的一部分。我很好奇DTO方法。你在說將結果集映射到一個實體嗎?而不是'Object []'? –

+0

另外,在查看字節碼增強時,我還需要'@Basic(LAZY)'屬性嗎? –

+0

您可以使用構造函數子句或Hibernate'ResultTransformer'將結果直接映射到DTO。至於BE,我想你需要'@Basic(LAZY)'來啓用屬性的延遲加載。否則,基本屬性是EAGER。 –

0

我寫了一篇關於如果您有興趣使用實體模型here時可能遇到的所有問題的文章。所以一般來說,如果可能的話你應該避免這種情況 你可能想給Blaze-Persistence Entity Views一個嘗試,這正是它的用例。您可以定義目標結構,即DTO作爲接口並將屬性映射到JPQL表達式。這也支持集合等,但在JPQL級別而不是SQL級別上工作。

相關問題