为什么我不能在Hibernate / NHibernate中创建子对象 - 棘手的映射问题

时间:2009-02-19 03:18:36

标签: nhibernate hibernate

我想我已经尝试过所有这些工作,但无济于事。 任何提示/帮助非常感谢。

以下父子关系会在创建父级时导致以下错误。

无法插入:[Kanpeki.Domain.CalEvtCatergory] ​​[SQL:INSERT INTO tb_calEvent_catergory(catergoryID,parentID,catergoryType,catergoryLabel,id)VALUES(?,?,?,?,?)]

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>

Child = CalEvtCatergory

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

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

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

它似乎没有将calEvent的(parentID)id应用于CalendarCatergory

1 个答案:

答案 0 :(得分:3)

听起来好像它可能试图将NULL插入到子表上的parent_id列中,该列标记为非null。您应该做两件事(可能)解决您的问题。第一, 改变

<property name="parentID" />

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

然后,通过将inverse =“true”添加到父级的包中,将关系标记为反向(即子级通过parentID属性管理关系的状态),如:

<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"/>
...

如果未指定级联,则必须单独保存每个对象。