Nhibernate 休眠下一个/上一个同级映射

Nhibernate 休眠下一个/上一个同级映射,nhibernate,hibernate,nhibernate-mapping,Nhibernate,Hibernate,Nhibernate Mapping,我正在使用nHibernate映射一个与.NET的System.Web.SiteMapNode非常相似的对象。为了使我的对象类似于此.NET对象,我希望它包含ParentNode、PreviousSibling、NextSibling和ChildNodes复杂属性 该表看起来有点像这样,可以更改: ID(int) 标题(字符串) 说明(字符串) 键(字符串) ParentNodeId(int) 有序位置(int) 只读(bool) Url(字符串) 我可能有一些不需要模仿.NET SiteM

我正在使用nHibernate映射一个与.NET的System.Web.SiteMapNode非常相似的对象。为了使我的对象类似于此.NET对象,我希望它包含ParentNode、PreviousSibling、NextSibling和ChildNodes复杂属性

该表看起来有点像这样,可以更改:

  • ID(int)
  • 标题(字符串)
  • 说明(字符串)
  • 键(字符串)
  • ParentNodeId(int)
  • 有序位置(int)
  • 只读(bool)
  • Url(字符串)
我可能有一些不需要模仿.NET SiteMapNode对象的其他属性(如isExternal bool),但我认为这些属性与这个问题无关

我当前的映射如下所示:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="AthletesCafe.Core.Domain.System.SiteMap" assembly="AthletesCafe.Core">
<class name="SiteMapNode" table="SiteMapNode" lazy="true" >

<id name="ID" type="Int32" unsaved-value="0">
  <column name="ID" not-null="true" unique="true" index="PK_SiteMapNode"/>
  <generator class="identity" />
</id>

<property name="Title" column="Title" type="String" length="255" not-null="true" />
<property name="Description" column="Description" type="String" not-null="false" />

<property name="Url" column="Description" type="String" not-null="true"  />

<property name="SiteMapKey" column="SiteMapKey" type="String" not-null="true" length="255"  />

<property name="OrdinalPosition" column="OrdinalPosition" type="Int32" not-null="true" />

<property name="ReadOnly" column="ReadOnly" not-null="true" type="System.Boolean" />

<property name="IsExternal" column="IsExternal" not-null="true" type="System.Boolean" />

<many-to-one name="ParentNode" column="ParentNodeId" class="AthletesCafe.Core.Domain.System.SiteMap.SiteMapNode, AthletesCafe.Core" 
             access="field.pascalcase-underscore" not-null="false" />
<many-to-one name="PreviousNode" column="ParentNodeId" class="EatMyTrainer.Core.Domain.SiteMap.SiteMapNode, EatMyTrainer.Core" not-null="false" /></hibernate-mapping>

ParentNode映射很简单,因为它应该只是一个简单的多对一映射。这是我的代码(未经测试,但我相信它是正确的):


子节点的映射应该只是一个简单的包,它将返回所有ParentNodeId等于当前ID的SiteMapNode对象。我还没有编写这个包,但我相信这不是什么大问题

我似乎无法解决的问题是如何处理下一个/上一个兄弟属性。对于每个节点,可以根据以下公式导出这些对象:

  • PreviousSibling:与当前对象具有相同的ParentNode(ParentNodeId),其OrdinalPosition应比当前对象的OrdinalPosition小一个
  • NextSibling:与当前对象具有相同的ParentNode(ParentNodeId),并且其OrdinalPosition应比当前对象的OrdinalPosition多一个

我认为这可以通过多对一映射上的formal属性来实现。这可能吗?我还没有找到一个很好的例子来说明它是如何工作的。

我认为你所要求的严格来说是不可能的(尽管我非常有兴趣看到解决方案,如果是的话)。有一个相对简单的解决方法,但NHibernate不支持在多端使用索引集合的双向一对多映射

想到的唯一一件事有点难看:让父对象保留它自己到每个子对象的索引映射(键控了OrdinalPosition)。在孩子身上做一些类似的事情:

public SiteMapNode NextSibling()
{
    return this.Parent.NextSibling(this);
}

我相信斯图尔特在这种情况下是正确的。对于多对一映射是不可能的。如果NHibernate提供了一种方法,在这个映射上进行子句化,那么我可能有机会

另一个可能的解决方案是创建一个使用字段设置器的行李,尽管效率很低。将成为下一个/上一个设置的公共属性仍将返回对象引用(与枚举相对)。在getter中,它只引用字段中可枚举项的第一个位置。延迟加载是理想的,因为NHibernate无法在对象初始加载的情况下一次性加载该对象。每次访问此对象都会受到惩罚

我想这两种解决方案都有相似的惩罚

public SiteMapNode NextSibling()
{
    return this.Parent.NextSibling(this);
}