NHibernate,一对一映射,级联插入

时间:2009-05-03 19:21:25

标签: nhibernate insert mapping cascade one-to-one

我在公司类和CompanySettings类之间建立了一对一的关系。当我创建一个新的Company对象时,(在Company的构造函数中为其Settings属性创建了一个CompanySettings对象),然后

SaveOrUpdate(session, companyObject)

我希望INSERT从公司级联到CompanySettings。但是,除非我在CompanySettings对象上明确调用SaveOrUpdate,否则不会发生这种情况。

映射文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`>
  <class name="AST.Domain.Company, AST.Domain" table="Companies">
    <id name="EntityID" column="CompanyId">
      <generator class="guid.comb" />
    </id>
    <property name="CompanyName" />
    . . .
    <one-to-one name="Settings" class="AST.Domain.CompanySettings, AST.Domain"
                constrained="true" lazy="false" />
  </class>
</hibernate-mapping>

我的公司设置类的映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="AST.Domain.CompanySettings, AST.Domain" table="CompanySettings">
    <id name="EntityID" column="CompanyId">
      <generator class="foreign">
        <param name="property">Company</param>
      </generator>
    </id>
    <property name="MaxUsers" />
    <one-to-one name="Company" class="AST.Domain.Company, AST.Domain" />
  </class>
</hibernate-mapping>

2 个答案:

答案 0 :(得分:5)

您是否尝试在one-to-one映射中指定cascade="all"

答案 1 :(得分:2)

在公司映射中设置一对一的级联属性。

但是,另一个说明: 您是否考虑将CompanySettings映射为公司的“组件”而不是单独的实体?

是不是'CompanySettings'是一个'价值对象',应该更好地作为一个组件进行映射?

通过这样做,您可以将CompanySettings值与“Company”放在同一个表中,但它将被视为一个单独的类。

由于这是一对一的映射,我认为它也是您的数据模型的更好选择。

然后,你的映射看起来像这样:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`>
  <class name="AST.Domain.Company, AST.Domain" table="Companies">
    <id name="EntityID" column="CompanyId">
      <generator class="guid.comb" />
    </id>
    <property name="CompanyName" />
    . . .
    <component name="Settings" class="AST.Domain.CompanySettings, AST.Domain">
        <property name="MaxUsers" />
    </component>
  </class>
</hibernate-mapping>

您确实会有2个单独的对象(公司和公司设置,公司将有'公司设置'对象,但设置将保存在公司表中。)

或者,为什么将CompanySettings放在单独的表中有什么特殊原因?我的意思是,它是一对一的关系,所以这完全没有必要(甚至是一种不好的做法:))。