我有一个相当大的继承层次结构,其中一些子类添加很少,而其他子类添加了很多。我不想使用 “每个类层次结构的表”或“每个子类的表”映射整个层次结构,因为它的大小和层次结构的复杂性。理想情况下,我想混合映射策略,使得子类添加很少的层次结构的部分组合成公共表和“每个类层次结构的表”,并且添加了很多的子类被分解为单独的表。使用这种方法,我希望有2或3个表浪费空间很少,而不是1个表,有很多字段不适用于大多数对象,或者20多个表,其中几个只有一个几列。
在NHibernate参考文档2.1.0版中,我找到了section 8.1.4 "Mixing table per class hierarchy with table per subclass"。此方法使用以下方法在层次结构中间切换策略:
...
<subclass ...>
<join ...>
<property ...>
...
</join>
</subclass>
...
这在理论上很棒。但实际上,我发现架构在“join”元素中允许的内容限制太多,以至于我无法完成所需的操作。
以下是架构定义的相关部分:
<xs:element name="join">
<xs:complexType>
<xs:sequence>
<xs:element ref="subselect" minOccurs="0" />
<xs:element ref="comment" minOccurs="0" />
<xs:element ref="key" />
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="property" />
<xs:element ref="many-to-one" />
<xs:element ref="component" />
<xs:element ref="dynamic-component" />
<xs:element ref="any" />
<xs:element ref="map" />
<xs:element ref="set" />
<xs:element ref="list" />
<xs:element ref="bag" />
<xs:element ref="idbag" />
<xs:element ref="array" />
<xs:element ref="primitive-array" />
</xs:choice>
<xs:element ref="sql-insert" minOccurs="0" />
<xs:element ref="sql-update" minOccurs="0" />
<xs:element ref="sql-delete" minOccurs="0" />
</xs:sequence>
<xs:attribute name="table" use="required" type="xs:string" />
<xs:attribute name="schema" type="xs:string" />
<xs:attribute name="catalog" type="xs:string" />
<xs:attribute name="subselect" type="xs:string" />
<xs:attribute name="fetch" default="join">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="join" />
<xs:enumeration value="select" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="inverse" default="false" type="xs:boolean">
</xs:attribute>
<xs:attribute name="optional" default="false" type="xs:boolean">
</xs:attribute>
</xs:complexType>
</xs:element>
如您所见,这允许使用“property”子元素或“component”子元素 ,但不能同时使用 。它也不允许“子类”子元素继续在策略更改点之下的层次结构。
有没有办法实现这个目标?
答案 0 :(得分:0)
您可能误读了该架构。它清楚地表明您可以根据需要使用尽可能多的组件,属性和多对一。
不,不可能在其中添加更多的子类策略。