【问题标题】:NHibernate, one-to-one mapping, cascade insertNHibernate,一对一映射,级联插入
【发布时间】:2010-10-23 11:57:45
【问题描述】:

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

SaveOrUpdate(session, companyObject)

我希望 INSERT 从 Company 级联到 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>

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 还是不行
    【解决方案2】:

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

    但是,另一方面: 您是否想过将 CompanySettings 映射为 Company 的“组件”而不是单独的实体?

    难道'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 个单独的对象(Company & CompanySettings,并且 Company 将有一个“Companysettings”对象,但设置将保存在 Company 表中)。

    或者,您将 CompanySettings 放在单独的表中是否有任何特殊原因?我的意思是,这是一对一的关系,所以这完全没有必要(恕我直言,甚至是不好的做法:))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多