我在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
答案 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>