2011-02-23 112 views
1

我在流利的Hibernate映射中有一個相當奇怪的要求。我有一個表(A)與另一個表(B)有複合外鍵關係。在表A的映射中,我希望同時具有從表B創建的對象和訪問定義密鑰的A的各個屬性。有沒有辦法做到這一點?如果我將列映射兩次,似乎我的索引超出範圍例外。多次映射列

我不能僅僅探索B的屬性,因爲表B中的行可能不存在。我很痛苦地意識到,我正在處理的結構中有一些顯着的氣味。這是處理遺留系統的人的命運。

回答

1

它的有點可能的,通過一點點的黑客。

我們要定義域與假的集合,我們將使用檢索單相關元素,如發現:

public class Foo 
{ 
    public virtual BarKey BarKey { get; set; } 
    public virtual Bar Bar { get { return Bars.SingleOrDefault(); } } 
    protected virtual ICollection<Bar> Bars { get; set; } 
} 

public class Bar 
{ 
    public virtual BarKey Id { get; set; } 
} 

//this class must override Equals and GetHashcode. Implementation not shown. 
public class BarKey 
{ 
    public virtual int X { get; set; } 
    public virtual int Y { get; set; } 
} 

BarKey組件包含的部分屬性鍵。

現在,映射:

<class name="Foo"> 
    <id ...><generator .../></id> 
    <component name="BarKey"> 
    <property name="X" /> 
    <property name="Y" /> 
    </component> 
    <bag name="Bars" inverse="true"> 
    <key property-ref="BarKey"> 
     <column name="X"/> 
     <column name="Y"/> 
    </key> 
    <one-to-many class="Bar"/> 
    </bag> 
</class> 
<class name="Bar"> 
    <composite-id name="Id"> 
    <key-property name="X" /> 
    <key-property name="Y" /> 
    </composite-id> 
</class> 

property-ref屬性有告訴NH匹配在酒吧那些列對富,而不是它的ID號的BarKey財產。