尝试使用同一个表映射多个行李 - 未能懒惰地初始化角色例外的集合

时间:2010-07-29 12:59:08

标签: nhibernate nhibernate-mapping

我在nhibernate中有映射问题。我正在使用nhibernate 2.2版本。

似乎问题在于映射,但我不确定这是原因。无论如何,我有两张表,我想映射。我为第一个表和数据传输对象创建了一个hbm文件。所有列都已映射,一切正常。

但是,现在我想在这个类中添加三个包,它将指向同一个表,我想要连接的第二个表。我创建了包并映射了所有内容,但是当我检索我的数据时,只有其中一个包被填满,而其他包被留空了,我得到一个错误“没有懒得初始化一个角色集合:com.organic .mitsu.hib.ModelContent.options - 没有关闭会话或会话“。而且我100%确定数据库中的数据是好的。当我从我的地图中删除两个袋子时,一切正常,只留下一个袋子。这是hbm文件:

<class name="MyFirstClass" table="MyFirstTable">
<id name="ID">
  <generator class="native" />
</id>
<property name="ItemOne" />
<property name="ItemTwo" />
<property name="ItemThree" />
<property name="ItemFour" />

<bag name="FirstItems" table="MySecondTable">
  <key column="ItemID" property-ref="ItemOne"/>
  <one-to-many class="Items" not-found="ignore"/>
</bag>

<bag name="SecondItems" table="MySecondTable">
  <key column="ItemID" property-ref="ItemTwo"/>
  <one-to-many class="Items" not-found="ignore"/>
</bag>

<bag name="ThirdItems" table="MySecondTable">
  <key column="ItemID" property-ref="ItemThree"/>
  <one-to-many class="Items" not-found="ignore"/>
</bag>

我该如何解决这个问题?这甚至可以这样做吗?

这是MySecondTable的映射:

<class name="Item" table="MySecondTable">
<id name="ID">
  <generator class="assigned" />
</id>
<property name="ItemID" />
<property name="Language" />
<property name="Value" />

实际上,我试图映射的原始内容是复合元素而没有MySecondTable的映射。我只有一个dto类Item,ItemID和Value列。我得到了同样的错误,映射看起来像这样:

<class name="MyFirstClass" table="MyFirstTable">
<id name="ID">
  <generator class="native" />
</id>
<property name="FirstItem" />
<property name="SecondItem" />
<property name="ThirdItem" />

<bag name="FirstItemNames" table="MySecondTable">
  <key column="ItemID" property-ref="FirstItem"/>
  <composite-element class="Item">
    <property name="Value" />
  </composite-element>
</bag>

<bag name="SecondItemNames" table="MySecondTable">
  <key column="ItemID" property-ref="SecondItem"/>
  <composite-element class="Item">
    <property name="Value" />
  </composite-element>
</bag>

<bag name="ThirdItemNames" table="MySecondTable">
  <key column="ItemID" property-ref="ThirdItem"/>
  <composite-element class="Item">
    <property name="Value" />
  </composite-element>
</bag>

1 个答案:

答案 0 :(得分:1)

听起来像SecondItems和ThirdItems是在会话关闭后懒洋洋地获取的,这是不允许的。您需要在会话处于活动状态时强制提取或更改映射,以便关闭延迟提取(默认设置)。

有关详细信息,请参阅here