2016-03-11 69 views
2

我有兩個hibernate註釋類。我正在FirstTable上做一個hibernate查詢。從列表中檢索數據後,使用GSON將對象轉換爲JSON字符串。轉換後的JSON字符串也將包含子表的數據。我的要求是讀取第一級數據。它不應該查詢該子表。如何使用休眠模式讀取一級父數據

步驟試過

要擷取我已經從其拆卸的EntityManager對象(也嘗試session.evict)對象之後實現這一點。關閉休眠會話和實體管理器對象。試圖將對象轉換爲JSON。在做這件事的時候,我得到了LazyInitializationException。有沒有解決方法或有另一種方法來實現這一點。

@Entity(name = "FirstTable") 
@Table(name = "FirstTable") 
@AccessType("property") 
public class FirstTable { 
    private SecondTable _SecondTable; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "SecondTable_ID") 
    public SecondTable getSecondTable() { 
     return _SecondTable; 
    } 
    public FirstTable setSecondTable(SecondTable value) { 
     this._SecondTable = value; 
     return this; 
    } 
    private long id; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="Id") 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id=id; 
    } 
} 

@Entity(name = "SecondTable") 
@Table(name = "SecondTable") 
@AccessType("property") 
public class SecondTable { 
    private String _RandomCol; 
    @Column(name="RandomCol") 
    public java.lang.String getRandomCol() { 
     return _RandomCol; 
    } 
    public SecondTable setRandomCol(java.lang.String value) { 
     this._RandomCol = value; 
     return this; 
    } 
    private long id; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="OId") 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id=id; 
    } 
} 

回答

0

私人短暫 SecondTable _SecondTable;

0

我正在處理相同的問題。據我瞭解這個回覆JPA Hibernate collections not lazily loaded如果你不想加載孩子級別,你不應該調用getChildren方法。但似乎你在嘗試將對象轉換爲json時實際調用了這個方法。

在你的情況下,如果可能的話,儘量不要自動將Object轉換爲Json,而是手動填充json手動放置你實際需要的屬性。如果在你的情況下不可能,請看這裏JPA + Hibernate - How to get FK of child entity without fetching that entity?

可能有更好的解決方案,但我沒有找到它。

就發現這裏的更好的辦法hibernate entity to json

0

LazyInitializationException正在發生的事情,因爲你正在試圖檢索子對象出交易的。即使您有detactedFirstTable實體,它仍然是一個實體,並且SecondTable實體也是一個實體並被標記爲未初始化。換句話說,FirstTable實體沒有持有SecondTable類,而是SecondTable實體的代理,這是投擲LazyInitializationException的內容。

如前所述,您可以通過將_SecondTable屬性設置爲null來修復它。然後json序列化程序將忽略該屬性。

更典型的是創建一個DTO或Data Transfer Object。這是通過創建基本上是實體的克隆的類來完成的,但只有您想通過json傳輸的屬性。

假設您打算利用RESTful服務,可能支持客戶端視圖框架(例如AngularJs),計算出DTO會爲您節省很多麻煩。

0

同意尼古拉斯。

所以一個補充的事情,在我上一個工作中,我使用了CXF的JACKSON提供程序。即使將數據子設置爲null,提供者也會使用「null」序列化該屬性(例如:{data = null})。 不知道是我的錯還是JACKSON-CXF夫婦。 使用類似@JsonIgnore的註釋可能是一個解決方案。

但是,如果您希望有一天能夠將您的實體轉移到整體中,將這種類型的註釋放在您的實體上可能效率不高。也許有一天,這將是必要的。 SO認爲要這樣做。

所以,在我的情況,我決定

1)讓實體沒有「JSON註解」和transfert喜歡它,如果需要

2)創建一個智能的DTO/POJO傳輸數據(每個需要都沒有一個DTO/POJO)