在nhibernate中使用复合键的自反性n:m关系 [英] self-reflexive n:m relation using composite keys in nhibernate

查看:99
本文介绍了在nhibernate中使用复合键的自反性n:m关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个遗留的数据库,有这样的3个表:

桌上绘画http://www.bilder-hochladen.net/files/gch8-1.png

物品表包含计划中的所有项目。
结构表定义了项目之间的关系。
父项是由 company year planId 结构映射到公司 parentItem >, year planId id c $ c> item 。

子项由 company year planId childItem 结构映射到 company year planId

我想出了:

<$ p

使用hbm或fluent映射在nhibernate中执行:m映射。 $ p> <?xml version =1.0encoding =utf-8?>
< hibernate-mapping namespace =Project.Modelassembly =Projectxmlns =urn:nhibernate-mapping-2.2>
< class name =Itemlazy =truetable =`itemschema =`dbo>
< composite-id>
< key-property name =Companycolumn =`company`/>
< key-property name =Yearcolumn =`year`/>
< key-property name =ItemIdcolumn =`id`/>
< / composite-id>
<! - 其他一些属性 - >

< set name =Parentstable =`structurefetch =select>
< key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`parentItem`/>
< / key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`id`/>
>
< / set>

< set name =Childstable =`structurefetch =select>
< key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`childItem`/>
< / key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`id`/>
>
< / set>

< column name =`company`/>
< column name =`planid`/>
< /多对一>
< / class>
< / hibernate-mapping>

然而,错误是:映射中的重复列... 所以我卡住了。任何建议?

解决方案

那么我设法解决这个问题。关键是使用key-many-to-one(FluentNHibernate中的KeyReference)和 not 来进行n:m映射(因为它不起作用!):

 <?xml version =1.0encoding =utf-8?> 
< hibernate-mapping namespace =Project.Modelassembly =Projectxmlns =urn:nhibernate-mapping-2.2>
< class name =Itemlazy =truetable =`itemschema =`dbo>
< composite-id>
< column name =Companycolumn =`company`/>
< column name =Planidcolumn =`planid`/>
< / key-many-to-one>
< key-property name =Yearcolumn =`year`/>
< key-property name =ItemIdcolumn =`id`/>
< / composite-id>
<! - 其他一些属性 - >

< set name =Parentstable =`structurefetch =select>
< key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`parentItem`/>
< / key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`id`/>
>
< / set>

< set name =Childstable =`structurefetch =select>
< key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`childItem`/>
< / key>
< column name =`company`/>
< column name =`year`/>
< column name =`planid`/>
< column name =`id`/>
>
< / set>
< / class>

< class name =Structurelazy =truetable =`itemschema =`dbo>
< composite-id>
< column name =company/>
< column name =year/>
< column name =planid/>
< column name =parentItem/>
< / key-many-to-one>
< column name =company/>
< column name =year/>
< column name =planid/>
< column name =childItem/>
< / key-many-to-one>
< key-property name =StructureIdcolumn =structureId/>
< / composite-id>
< / class>

< / hibernate-mapping>

这看起来有些奇怪,尤其是,结构的关键是公司,年份和planid的部分。但它工作...

I have a legacy database with 3 tables like this:
Painting of Tables http://www.bilder-hochladen.net/files/gch8-1.png
The Items table contains all the Items in a Plan. The Structure table defines the relation between the items. A parent item is defined by company, year, planId and parentItem of table structure mapping to company, year, planId and id of table item.
A child item is defined by company, year, planId and childItem of table structure mapping to company, year, planId and id of table item.

I am searching for a way to do a n:m mapping in nhibernate using either hbm or fluent mappings.

I came up with:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Project.Model" assembly="Project" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Item" lazy="true" table="`item`" schema="`dbo`">
    <composite-id>
        <key-property name="Company" column="`company`" />
        <key-property name="Year" column="`year`" />
        <key-property name="Planid" column="`planid`" />
        <key-property name="ItemId" column="`id`" />
    </composite-id>  
    <!-- Some other properties -->

    <set name="Parents" table="`structure`" fetch="select">
        <key>
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`parentItem`" />
        </key>
        <many-to-many class="Item">        
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`id`" />
        </many-to-many>
    </set>

    <set name="Childs" table="`structure`" fetch="select">
        <key>
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`childItem`" />
        </key>
        <many-to-many class="Item">        
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`id`" />
        </many-to-many>
    </set>

    <many-to-one name="Plan" class="Plan" not-null="true" fetch="select">
        <column name="`company`" />
        <column name="`planid`" />
    </many-to-one>
  </class>
</hibernate-mapping>

The error however is: Repeated column in mapping … - so I'm stuck. Any suggestions?

解决方案

Well I managed to solve this one. The key was to use key-many-to-one (KeyReference in FluentNHibernate) and not to make n:m mapping (because it does not work!):

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Project.Model" assembly="Project" xmlns="urn:nhibernate-mapping-2.2">
<class name="Item" lazy="true" table="`item`" schema="`dbo`">
  <composite-id>
    <key-many-to-one name="Plan" class="Plan">
      <column name="Company" column="`company`" />
      <column name="Planid" column="`planid`" />
    </key-many-to-one>
    <key-property name="Year" column="`year`" />
    <key-property name="ItemId" column="`id`" />
  </composite-id>  
  <!-- Some other properties -->

  <set name="Parents" table="`structure`" fetch="select">
    <key>
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`parentItem`" />
    </key>
    <many-to-many class="Item">        
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`id`" />
    </many-to-many>
  </set>

  <set name="Childs" table="`structure`" fetch="select">
    <key>
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`childItem`" />
    </key>
    <many-to-many class="Item">        
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`id`" />
    </many-to-many>
  </set>
  </class>

  <class name="Structure" lazy="true" table="`item`" schema="`dbo`">
    <composite-id>
  <key-many-to-one name="Parent" class="Item">
    <column name="company" />
    <column name="year" />
    <column name="planid" />
    <column name="parentItem" />
  </key-many-to-one>
  <key-many-to-one name="Child" class="Item">
    <column name="company" />
    <column name="year" />
    <column name="planid" />
    <column name="childItem" />
  </key-many-to-one>
  <key-property name="StructureId" column="structureId" />
</composite-id>      
</class>

</hibernate-mapping>

This looks somewhat weird, esp. the part where company, year and planid are twice in the key of Structure. But It works…

这篇关于在nhibernate中使用复合键的自反性n:m关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆