NHibernate映射由多个类包含的类

时间:2011-03-31 19:32:48

标签: nhibernate foreign-key-relationship

我在NHibernate映射中遇到了问题。 我有班级公司,人员和地址;公司和个人都可以拥有地址,因此我在两者中都采用了地址。为了存储这个,我有公司,人员和地址表。现在公司将拥有Address对象,Person也将具有Address Object,因此Address也应该引用Company和Person对象。所以我创建了两个地址1的子类.CompanyAddress 2. PersonAddress和在数据库中我创建了另外两个表Company_Address和Person_Address。现在在Address.hbm.xml中,我为CompanyAddress和PersonAddress添加了Joined子类,它们分别引用了Company_Address和Person_Address表。

现在,CompanyAddress类中包含公司对象,而PersonAddress类中包含Person对象。

Company_Address有2列AddressId(PK)和CompanyId(FK) - > Company Person_Address有2列AddressId(PK)和PersonId(FK) - > Person

我在Company.hbm.xml中为Address创建了一对一的映射。 当我保存公司对象时,除了Company_Address之外,每个表都正确填充。 AddressId已存储,但未存储CompanyId。

我不知道如何让这个工作

如果有人可以遇到此问题,请提供帮助。

提前致谢!!! Pawan Shukla

2 个答案:

答案 0 :(得分:0)

不要这样做。地址显然不是一个实体(因此没有自己的表,也没有主键)。我宁愿做的是将其建模为一个组件。示例映射可能如下所示:

<class name="Company"
    table="Company">

    <id name="Id">
        <generator class="identity"/>
    </id>
    <property name="CompanyName" />
    <component name="Address">
        <property name="Street"/>
        <property name="HouseNumber"/>
        <property name="City"/>
        <property name="PostOffice"/>
    </component>
</class>

只是谷歌一点。在DDD中,有一个与实体相对的值对象的概念,在NHibernate中建模值对象的方法是使用组件。

答案 1 :(得分:0)

听起来你可能已经过度规范了,因为你已经建立了一对一的映射。可能更容易(和代码中的WAY更清晰)是将地址字段放在Company和Person表中,然后设置一个简单的地址对象并将其视为一个组件。这是我的地址类:

public class StreetAddress
{
    public string CountryCode { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string County { get; set; }
    public string StateCode { get; set; }
    public string PostalCode { get; set; }

    public StreetAddress()
    {
        // Constructor for NHibernate
    }

    public StreetAddress(string countryCode, string street, string city, string county, string stateCode, string postalCode)
    {
        CountryCode = countryCode;
        Street = street;
        City = city;
        County = county;
        StateCode = stateCode;
        PostalCode = postalCode;
    }
}

然后将地址视为一个组件,并将其映射为:

<component name="Address" insert="true" update="true" optimistic-lock="true">
  <property name="CountryCode">
    <column name="Address_CountryCode" />
  </property>
  <property name="Street">
    <column name="Address_Street" />
  </property>
  <property name="City">
    <column name="Address_City" />
  </property>
  <property name="County">
    <column name="Address_County" />
  </property>
  <property name="StateCode">
    <column name="Address_StateCode" />
  </property>
  <property name="PostalCode">
    <column name="Address_PostalCode" />
  </property>
</component>