Смешивание стратегий отображения наследования в NHibernate - PullRequest
1 голос
/ 26 апреля 2010

У меня довольно большая иерархия наследования, в которой некоторые из подклассов добавляют очень мало, а другие добавляют совсем немного. Я не хочу отображать всю иерархию, используя либо"таблицу на иерархию классов" или"таблицу на подкласс" из-за размера и сложности иерархия. В идеале я хотел бы смешать стратегии отображения таким образом, чтобы части иерархии, в которых подклассы добавляли очень мало, объединялись в общую таблицу «таблица на иерархию классов», а подклассы, которые добавляют много, разбиваются на отдельные таблицы. Используя этот подход, я ожидал бы иметь 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>

Как видите, это позволяет использовать дочерние элементы "свойства" или дочерние элементы "компонента", , но не оба . Это также не позволяет дочерним элементам «подкласса» продолжать иерархию ниже точки, в которой стратегия была изменена.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 27 апреля 2010

Возможно, вы неправильно прочитали эту схему. Это ясно показывает, что вы можете использовать столько компонентов, свойств и множества, сколько хотите.

И нет, в него невозможно добавить больше стратегий подклассов.

...