我有一个复杂的映射,我认为应该可行。但是,为什么在编译之后,类A.d列似乎不存在?
public abstract Class A {
private Integer Id;
..
...
}
public Class SubA extend A {
private D d;
}
public Class D {
private SubA subA;
}
A.hbm.xml
<class name="A" table="A" abstract="true"/>
...
<subclass
name="SubA"
discriminator-value="SUB_A"
lazy="false"
>
<join table="TABLE_SUB_A">
<key column="ID"/>
<many-to-one name="d"
column="COL_D"
class="D"
cascade="NONE"
outer-join="true"
unique="true"/>
</join>
</subclass>
</class>
D.hbm.xml
<one-to-one name="subA"
class="SubA"
property-ref="d"/>
答案 0 :(得分:0)
您的代码未在A
类中显示鉴别器列定义,我假设它在那里。此外,没有“外连接”属性;它应该是fetch="outer-join"
而已。
除此之外,它看起来还不错 - d
属性应该在subA
上查找,而不是A
。你确定你发布时没有改变任何东西(我不认为你真正的实体被称为A
和D
,所以请仔细检查你的映射确实如图所示。 / p>
另外,为什么在每个子类的表中使用discriminator?使用joined-subclass可以更轻松地进行映射,而不需要多余的列;鉴别器的唯一优点是避免在子类表上进行外连接,这通常不是什么大问题(另外你还没有在你的子类上指定fetch="select"
)