NHibernate один ко многим не спасает детей - PullRequest
0 голосов
/ 22 января 2012
class A {..} 
class ContainedA { property of type A and some extra information }
class B : A { collection of type ContainedA  }

Как вы можете сказать, идея состоит в том, чтобы иметь возможность содержать один экземпляр A в нескольких B, сам B также имеет тип A, только он может содержать другие A

Отображение A и B

  <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="REDACTED"
    assembly= "REDACTED">

    <class name="A" table="A" discriminator-value="1">
        <id name="Id" column="Id" type="int" access="field.camelcase-underscore">
            <generator class="identity" />
        </id>

        <discriminator column="Type" type="int"/>

        <subclass name="B" extends="A" discriminator-value="2">
            <bag name="ContainedAs" cascade="all">
                <key column="AInternalId"/>
                <one-to-many class="ContainedA"/>
            </bag>
        </subclass>

    </class>
</hibernate-mapping>

Отображение для ContainedA

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="REDACTED"
    assembly= "REDACTED">

    <class name="ContainedA" table="ContainedA">
        <id name="Id" type="int" access="field.camelcase-underscore" column="Id">
            <generator class="identity" />
        </id>
        <many-to-one name="A" class="A" column="ContainedAInternalId" cascade="save-update"/>
        <property name="SomeOtherInfoString" column="SomeOtherInfoString" not-null="true"/>
    </class>
</hibernate-mapping>

Моя проблема в том, что когда я сохраняю контейнер B, он не сохраняет свою коллекцию ContainedAs, а не фактическую содержимое A. Это должно быть надежно, B может быть назначен как существующий, так и не существующий As, и я хочу выполнить один сеанс. Сохраните (B) и сохраните все.

Ваша помощь в этом вопросе будет принята с благодарностью.

РЕДАКТИРОВАТЬ: обнаружил ошибку в одном из оригинальных HBM исправил ее, все еще не работает

Ответы [ 2 ]

1 голос
/ 23 января 2012

Вам необходимо показать код в дополнение к отображению.Но я заметил, что у вас не установлен обратный атрибут.Атрибут inverse определяет, какая сторона «владеет» отношениями.Это немного нелогично, но вы устанавливаете inverse = "true", чтобы объявить, что другой стороне принадлежит отношение.

Типичное отношение один ко многим отображается так, что сторона многих является обратной стороной,При таком отображении необходимо одновременно добавить содержащийся объект в коллекцию (с одной стороны) и установить ссылку на содержащий объект на объекте с одной стороны.

0 голосов
/ 01 апреля 2012

Это не полный ответ, скорее обходной путь, который решил проблему.

(скопировано из моего комментария)

"Я несколько решил проблему, переместивмешок из B в конкретное отображение подкласса, в моем коде B сам базовый подкласс, который имеет две разные реализации, по-видимому, Nhibernate просто проигнорировал мешок, потому что он был в базовом отображении подкласса. "

...