Почему я не могу создать дочерние объекты в Hibernate / NHibernate - сложная проблема с отображением - PullRequest
1 голос
/ 19 февраля 2009

Я думаю, что попробовал все, чтобы заставить это работать, но безрезультатно. Любые советы / помощь высоко ценится.

Следующее отношение parent-children вызывает следующую ошибку при создании родителя.

не удалось вставить: [Kanpeki.Domain.CalEvtCatergory] [SQL: INSERT INTO tb_calEvent_catergory (catergoryID, parentID, catergoryType, catergoryLabel, id) ЗНАЧЕНИЯ (?,?,?,?,?)]

2 сопоставления объектов следующие:

Parent = CalEvent

  <id name="id" column="id">
  <generator class="hilo"/>
</id>

<bag name="catergories" table="tb_calEvent_catergory"  lazy="false" cascade="all">
  <key column="parentID" foreign-key="id"/>
  <one-to-many class="CalEvtCatergory"/>
</bag>

Ребенок = CalEvtCatergory

  <class name="CalendarCatergory" table="tb_calendar_catergory" lazy="false" >

<id name="id" column="id">
  <generator class="hilo"/>
</id>

<property name="parentID" />
snip....

Кажется, он не применяет идентификатор (parentID) calEvent к CalendarCatergory

1 Ответ

3 голосов
/ 20 февраля 2009

Похоже, что он, вероятно, пытается вставить NULL в столбец parent_id в дочерней таблице, которая помечена как ненулевая. Есть две вещи, которые вы должны сделать, чтобы (вероятно) решить вашу проблему. Первый, изменить

<property name="parentID" />

до

<many-to-one name="parentID" column="parent_id_column_name_here" not-null="true" />

Затем пометьте отношение как обратное (т. Е. Ребенок управляет состоянием отношения через свойство parentID), добавив inverse = "true" в пакет на родительском элементе, например:

<bag name="catergories" table="tb_calEvent_catergory" inverse="true" lazy="false" cascade="all">
  <key column="parentID" foreign-key="id"/>
  <one-to-many class="CalEvtCatergory"/>
</bag>

Кроме того, я не уверен, что отображение сумок правильное. В частности, атрибут внешнего ключа. Я не мог найти это в документации. NHibernate, вероятно, просто игнорирует это, но я бы избавился от этого. В общем случае двунаправленные отображения типа «один ко многим» должны выглядеть следующим образом:

<!-- Parent Table Mapping -->
...
<set name="Children" inverse="true" [(optional)cascade="all|save-update|etc"]>
    <key column="parent_id" />
    <one-to-many class="Child" />
</set>
...

<!-- Child Table Mapping -->
...
<many-to-one name="Parent" column="parent_id" not-null="true"/>
...

Если вы не указываете каскадирование, вы должны сохранять каждый объект отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...