2015-03-31 79 views
0

我有以下的Hibernate映射:休眠 - 負載孩子

<class name="Database.Content" table="..." schema="" catalog="..."> 
    <id name="id"> 
     <column name="id" sql-type="int" not-null="true"/> 
    </id> 
    <property name="week"> 
     <column name="week" sql-type="int"/> 
    </property> 
    <property name="day"> 
     <column name="day" sql-type="int"/> 
    </property> 
    <property name="hour"> 
     <column name="hour" sql-type="int"/> 
    </property> 
    <property name="type"> 
     <column name="type" sql-type="int" not-null="true"/> 
    </property> 
    <many-to-one name="group" class="Database.Group"> 
     <column name="group"/> 
    </many-to-one> 
    <many-to-one name="table" class="Database.Table"> 
     <column name="table" not-null="true"/> 
    </many-to-one> 
    <list name="entries" inverse="true" table="..."> 
     <key> 
      <column name="content" not-null="true"/> 
     </key> 
     <list-index column="id"/> 
     <one-to-many not-found="ignore" class="Database.Entry"/> 
    </list> 
</class> 
<class name="Database.Entry" table="..." schema="" catalog="..."> 
    <id name="id"> 
     <column name="id" sql-type="int" not-null="true"/> 
    </id> 
    <property name="teacher"> 
     <column name="teacher" sql-type="int" not-null="true"/> 
    </property> 
    <property name="course"> 
     <column name="course" sql-type="int" not-null="true"/> 
    </property> 
    <property name="room"> 
     <column name="room" sql-type="int" not-null="true"/> 
    </property> 
    <property name="p"> 
     <column name="p" sql-type="int" not-null="true"/> 
    </property> 
    <many-to-one name="content" class="Database.Content" fetch="join" lazy="false"> 
     <column name="content" not-null="true"/> 
    </many-to-one> 
</class> 

現在我想查詢所有contents與相應entries

List<Content> contents = session.createQuery("from Content c WHERE c.day IN :days ").setParameterList("days", days).list(); 

查詢返回正確的響應。但是,當我執行以下操作時:

contents.get(0).getEntries() 

存在一堆空值。什麼是正確加載所有對應的entries每個content的正確方法?

我有大約20,000個content記錄,並且大多數記錄只有一個條目。

如果我設置lazy="false"entries的列表,我得到Java heap space錯誤。


我最終獲取entries和加入contents

List<Entry> entries = session.createQuery("select e from Entry e Join e.content c WHERE c.day IN :days ").setParameterList("days", days).list(); 

我也改變lazyproxy

<many-to-one name="content" class="Database.Content" fetch="join" lazy="proxy"> 
    <column name="content" not-null="true"/> 
</many-to-one> 

回答

1

添加懶= false屬性:

​​

希望幫助你!

+0

謝謝。我有大約2萬個「內容」記錄,大多數記錄通常只有一個條目。但現在需要永久加載它們,所以我現在無法分辨它是否可行。 – nickbusted 2015-03-31 08:02:37

+0

我得到以下錯誤java.lang.OutOfMemoryError:Java堆空間 – nickbusted 2015-03-31 08:05:31

+0

我相信20.000元素太多了。您必須刪除lazy = false並調用Hibernate上下文中的contents.get(0).getEntries() – vathek 2015-03-31 08:09:06

1

嘗試調用:

contents.get(0).getEntries()大小();

強制hibernate加載孩子。

+0

結果始終是一個比預期大得多的數字 – nickbusted 2015-03-31 08:01:12

+0

您是否嘗試過對它們進行交互? – Wez 2015-04-01 03:35:14