它是一对一还是组件? Nhibernate映射

时间:2009-02-12 15:02:03

标签: .net asp.net nhibernate nhibernate-mapping

假设我有人员和地址类,他们在DB中有不同的表。

一个人可以拥有一个地址类。这对我来说很重要。一个人可以只有一个地址作为子元素,我想将它们保存在数据库的不同表中。

通常我知道我需要将它们放在同一个表中,但我的场景需要这个。

(它看起来像一对多,但我不想只为一个对象设置一个集合)

Person     Address
-------    -------
id         id
Name       PersonId
           StreetName

和班级代码

Person                                                 
--------
public virtual long Id{get;set;}
public virtual Address MyAddress {get;set;}

如你所见,当我找到任何人时,我想亲自获得地址财产?但他们在不同的表格中。如何完成这种映射?

提前致谢

4 个答案:

答案 0 :(得分:2)

您无法使用组件映射地址,因为它有自己的表。如果只有一个表中的所有字段,则可以使用它。 来自Hibernate参考:

  

组件元素将子对象的属性映射到父类表的列。

您应该使用一对一的关系来映射场景中的表和类。

答案 1 :(得分:1)

要在数据库中强制执行一对一,您还可以在Address表中的PersonId上添加唯一约束。

答案 2 :(得分:0)

你确定这是一对一的关系吗?我认为这是一种多对一的关系,因为通常一个人可以住在某个地址。

无论如何,如果它是多对一关系,我会像这样映射它们。在你的情况下我会做的是从地址表中删除PersonId FK并从Person表中引用地址表,这样你就有了这样的东西。

Person    Address
------    -------
id        id
Name      StreetName
AddressId

<many-to-one name="MyAddress" class="Address" column="AddressId"/>

如果你坚持一对一的关系我会建议将两个表合并在一起。

答案 3 :(得分:0)

我在Person mapping中使用了以下代码来完成它。

<one-to-one lazy="proxy" name="MyAddress" class="Address" property-ref="PersonId" cascade="delete" />

希望帮助别人