首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用共享列将组合id和多个id映射为一个(多列)

如何用共享列将组合id和多个id映射为一个(多列)
EN

Stack Overflow用户
提问于 2012-03-18 14:44:29
回答 1查看 8.5K关注 0票数 2

在大型遗留数据库中,复合id和多列多对一关系之间的共享列存在问题。我将问题简化为映射,下面是问题的再现:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Alfa">    
    <composite-id name="AlfaId" class="AlfaCompositeId">
      <key-many-to-one name="Bravo" class="Bravo" column="BRAVO_ID" />
      <key-property name="CharlieId1" column="CHARLIE_ID1" />
    </composite-id>
    <many-to-one name="C" class="Charlie">
      <column name="CHARLIE_ID1" />
      <column name="BRAVO_ID" />
    </many-to-one>
    <property name="CookieA" column="COOKIE_A" />
    </class>
  <class name="Bravo">
    <id name="BravoId" column="BRAVO_ID" />
    <property name="CookieB" column="COOKIE_B" />
  </class>
  <class name="Charlie">
    <composite-id>
      <key-property name="CharlieId1" column="CHARLIE_ID1" />
      <key-many-to-one name="Bravo" class="Bravo" column="BRAVO_ID" /> <!-- Reused column !!! -->
    </composite-id>
    <property name="CookieC" />
  </class>
</hibernate-mapping>

试图保存Alfa实体将引发:

代码语言:javascript
复制
IndexOutOfRangeException (Message=Invalid index 3 for this SqlParameterCollection with Count=3).

NHibernate试图两次添加BRAVO_ID列值。一次用于复合id,一次用于多到一个FK。

如何更改为映射XML以告诉NHibernate忽略'BRAVO_ID‘列的第二个映射?

任何小费都会得到赏识。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-19 09:09:30

您将相同的列映射为CompositeId和ManyToOne,只需去掉compositeId

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Alfa">    
    <composite-id>
      <key-many-to-one name="Charly" class="Charlie">
        <column name="CHARLIE_ID1" />
        <column name="BRAVO_ID" />
      </key-many-to-one>
    </composite-id>
    <property name="CookieA" column="COOKIE_A" />
  </class>

  <class name="Bravo">
    <id name="Id" column="BRAVO_ID" />
    <property name="CookieB" column="COOKIE_B" />
  </class>

  <class name="Charlie">
    <composite-id>
      <key-property name="IdPart1" column="CHARLIE_ID1" />
      <key-many-to-one name="Bravo" class="Bravo" column="BRAVO_ID" />
    </composite-id>
    <property name="CookieC" />
  </class>
</hibernate-mapping>

并通过该属性访问它

Bavo = alfa.Charly.Bravo;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9759234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档