【发布时间】:2011-06-07 15:07:23
【问题描述】:
假设我有两个持久类Cat 和Hat。让我们想象一下,两者之间的关系是双向的一对多,因为在一只猫中可以有许多不同的帽子,我们可以在两个方向上遍历映射。为了在每个类的实例之间创建关联,我应该能够,如果我错了,我应该能够纠正我,执行以下操作:
Cat whiskers = new Cat();
Hat redHat = new Hat();
redHat.Id = 1; // normally assigned by generator but this makes example more explicit
whiskers.Hats.Add(redHat);
catService.Save(whiskers);
hatService.Save(redHat);
考虑到这一点,我是否应该无法通过执行以下操作来检索与 redHat 关联的 Cat?
Hat hat = hatService.FindById(1); // redHat has Id 1
Cat cat = hat.Cat; // cat should be whiskers
不幸的是,当我尝试使用这种技术时,cat 结果在最后一行中显示为空对象。我猜我在 Cat.hbm.xml 中的一对多映射中遗漏了一些东西,或者至少我希望它是那么简单的东西。这是它目前的样子:
<set name="Hats" inverse="true">
<key column="Id"/>
<one-to-many class="Hat"/>
</set>
我在 Hat.hbm.xml 中没有映射,因为添加一个会导致“重复映射”错误。我阅读了有关关联映射的 Hibernate documentation,但仍然无法正常工作。我做错了什么?
下面的完整映射文件:
Cat.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Domain"
namespace="Domain">
<class name="Cat" table="cats" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
<property name="Name" />
<set name="Hats" inverse="true">
<key column="Id"/>
<one-to-many class="Hat"/>
</set>
</class>
</hibernate-mapping>
Hat.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Domain"
namespace="Domain">
<class name="Hat" table="hats" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
</class>
</hibernate-mapping>
编辑
我认为问题在于我没有在 Cat 类中初始化 ISet<Hat> 值。但是,我遇到了一个新问题。当我尝试访问关联时,我收到此错误:
Could not initialize proxy - no Session.
我认为如果我在我的 DAO 中创建一个可以将它包装在这样的会话中的方法,这将很容易避免:
public Cat GetRelatedCat(Hat hat)
{
Cat cat;
using (ISession session = HibernateUtil.GetSessionFactory().OpenSession())
{
cat = hat.Cat;
}
return cat;
}
这会产生相同的“无会话”错误。我被难住了。
【问题讨论】:
-
你能展示你完整的映射文件吗?
-
@MarioH:我已经用完整的映射文件更新了帖子。
标签: c# .net nhibernate associations mappings