我的流利hibernate地图中有一个相当奇怪的要求。我有一个表(A),它与另一个表(B)有复合外键关系。在表A的映射中,我希望从表B创建对象并访问定义密钥的A的各个属性。有没有办法做到这一点?如果我将列映射两次,我似乎会将索引超出范围异常。
我不能只考虑B的属性,因为表B中的行可能不存在。我痛苦地意识到我正在处理的结构中有一些重要的气味。这就是那些处理遗留系统的人的命运。
答案 0 :(得分: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将Bar中的这些列与Foo的BarKey
属性相匹配,而不是其ID。