NHibernate / Hibernate中接口的映射集合

时间:2011-07-24 22:10:37

标签: hibernate nhibernate interface polymorphism

比如说,我有以下内容:

public interface IPet
{
    long? Id { get; set; }
    string Name { get; set; }
}

public class Cat : IPet
{
    public virtual long? Id { get; set; }
    public virtual string Name { get; set; }
}

public class Dog : IPet
{
    public virtual long? Id { get; set; }
    public virtual string Name { get; set; }
}

以下映射:

<class name="Cat" table="`Cat`" >
  <id name="Id" type="long">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
</class>

<class name="Dog" table="`Dog`" >
  <id name="Id" type="long">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
</class>

现在,当我执行以下操作时:

IList<IPet> pets = session.CreateCriteria<IPet>().List<IPet>();

由于隐式多态性,一个很好的功能,它返回所有的猫和狗。现在考虑一下:

public class PetShop
{
    public long? Id { get; set; }
    public List<IPet> Pets { get; set; }
}

<class name="PetShop" table="`PetShop`" >
  <id name="Id" type="long">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
  <bag name="Pets"  cascade="all">
    <key column="PetShopId"/>
    <one-to-many class="IPet"/>
  </bag>
</class>

我希望这意味着宠物的集合会使用隐式多态来填充集合,但我得到错误'Association references unmapped class:IntefaceCollectionExample.Domain.Entities.IPet'。我可以为IPet创建一个映射和表,只包含Id,但这感觉不直观。我可以使用union-subclass但是会丢失使用generator class =“identity”的选项。我可以使用多对多但我觉得在这种情况下这会非常笨拙。

有什么我想念的吗?有没有办法为IPet接口创建映射但不需要表,然后指定Cat和Dog实现它。或者有没有比我上面列出的方法更好的方法?

1 个答案:

答案 0 :(得分:1)

one-to-many场景的隐式多态性为not supported

您可以使用显式继承策略(即必须映射整个层次结构,从界面开始),或者为集合创建一个表并将其映射为many-to-any