我在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>
答案 0 :(得分:1)
听起来像SecondItems和ThirdItems是在会话关闭后懒洋洋地获取的,这是不允许的。您需要在会话处于活动状态时强制提取或更改映射,以便关闭延迟提取(默认设置)。
有关详细信息,请参阅here。