在大型遗留数据库中,复合id和多列多对一关系之间的共享列存在问题。我将问题简化为映射,下面是问题的再现:
<?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实体将引发:
IndexOutOfRangeException (Message=Invalid index 3 for this SqlParameterCollection with Count=3).NHibernate试图两次添加BRAVO_ID列值。一次用于复合id,一次用于多到一个FK。
如何更改为映射XML以告诉NHibernate忽略'BRAVO_ID‘列的第二个映射?
任何小费都会得到赏识。
发布于 2012-03-19 09:09:30
您将相同的列映射为CompositeId和ManyToOne,只需去掉compositeId
<?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;
https://stackoverflow.com/questions/9759234
复制相似问题