У меня довольно большая иерархия наследования, в которой некоторые из подклассов добавляют очень мало, а другие добавляют совсем немного. Я не хочу отображать всю иерархию, используя либо"таблицу на иерархию классов" или"таблицу на подкласс" из-за размера и сложности иерархия. В идеале я хотел бы смешать стратегии отображения таким образом, чтобы части иерархии, в которых подклассы добавляли очень мало, объединялись в общую таблицу «таблица на иерархию классов», а подклассы, которые добавляют много, разбиваются на отдельные таблицы. Используя этот подход, я ожидал бы иметь 2 или 3 таблицы с очень небольшим потерянным пространством вместо 1 таблицы с большим количеством полей, которые не относятся к большинству объектов, или более 20 таблиц, некоторые из которых будут иметь только пара колонн.
В справочной документации NHibernate версии 2.1.0 я обнаружил раздел 8.1.4 "Смешивание таблицы по иерархии классов с таблицей по подклассу" . Этот подход переключает стратегии частично вниз по иерархии, используя:
...
<subclass ...>
<join ...>
<property ...>
...
</join>
</subclass>
...
Это прекрасно в теории. На практике, однако, я обнаружил, что схема была слишком ограничена в том, что было разрешено внутри элемента «соединение», чтобы я мог выполнить то, что мне нужно.
Вот соответствующая часть определения схемы:
<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>
Как видите, это позволяет использовать дочерние элементы "свойства" или дочерние элементы "компонента", , но не оба . Это также не позволяет дочерним элементам «подкласса» продолжать иерархию ниже точки, в которой стратегия была изменена.
Есть ли способ сделать это?