2015-03-31 130 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