【问题标题】:Creating and retrieving associated mappings in NHibernate在 NHibernate 中创建和检索关联的映射
【发布时间】:2011-06-07 15:07:23
【问题描述】:

假设我有两个持久类CatHat。让我们想象一下,两者之间的关系是双向的一对多,因为在一只猫中可以有许多不同的帽子,我们可以在两个方向上遍历映射。为了在每个类的实例之间创建关联,我应该能够,如果我错了,我应该能够纠正我,执行以下操作:

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&lt;Hat&gt; 值。但是,我遇到了一个新问题。当我尝试访问关联时,我收到此错误:

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


【解决方案1】:
  1. 您需要在 hat.hbm 中添加多对一条目。 我认为应该可以。

  2. 那你要设置关联的两边

    whiskers.Hats.Add(redHat);

    redHat.Cat=whiskers;

我认为这应该使您的示例工作。

“无会话”问题的原因是,集合代理仅适用于创建它的会话。因此,在您的示例中,它仅适用于创建您的 Hat 实例的会话。可以将代理与另一个会话连接,但通常不推荐这样做,因为它对事务边界和数据一致性有复杂的影响。

【讨论】:

  • 我在 Hat.hbm 中添加了 &lt;many-to-one name="Cat" column="Id" cascade="all" /&gt;,但现在当我尝试持久化 Hat 时,我得到了 Parameter index is out of range。此外,如果您只能通过创建它的会话访问集合代理,您将如何检索对象的关联映射?
  • 你必须为列使用另一个名称,因为它已经用于 pk。使用“cat_id”之类的东西就可以了。
【解决方案2】:

我通过创建一个 SessionManager 解决了这个问题,它允许我打开一个 Session,执行任何事务并访问 Session 单例中的任何集合代理,然后关闭 Session。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多