繁体   English   中英

是一对一还是 Component ? 休眠映射

[英]Is it one-to-one or Component ? Nhibernate Mapping

假设我有 Person 和 Address 类,并且它们在 DB 中有不同的表。

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

通常我知道我需要将它们放在同一张桌子上,但我的场景需要这个。

(而且它看起来像一对多,但我不想只为一个对象创建一个集合)

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

和班级代码

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

如您所见,当我得到任何 Person 时,我想亲自获得 Address 属性? 但是它们在不同的表中。 如何进行这种映射?

提前致谢

您不能使用组件映射地址,因为它有自己的表。 如果所有字段都在一张表中,则可以使用它。 从休眠参考:

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

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

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

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

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

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

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

如果您确实坚持一对一的关系,我建议将两个表合并在一起。

我在 Person 映射中使用了下面的代码来完成它。

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

希望能帮助别人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM