关于值对象与实体的再讨论
关于值对象与实体的再讨论
猪刚烈 发表于4年前
关于值对象与实体的再讨论
  • 发表于 4年前
  • 阅读 18
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

在领域模型中,实体与值对象的概念非常重要,Hibernate也要求明确区分这两者,以至于它们的映射配制上都不一样。

以一对多为例,同是一个set,如果是实体会使用<one-to-many>,@OneToMany,如果是值对象,会使用<composite-elementt>,@CollectionOfElements.实体与值对象的一个重要区别在于:实体有自己的生命周期,而值对象没有,它总是依附于一个实体,如果这个实体不存在了,那么它也将一同消亡。这一点在hibernate的映射上体现的非常明显:@OneToMany有级联选项,而@CollectionOfElements没有。

 

 

小结:

实体与值对象的区别:

1.实体一定要有一个唯一标识符(ID)!以确保系统能够明确的区分每一个实体,并在需要的时候准确的找到它。值对象没有ID!这是因为系统从来不会直接去检索值对象。值对象总是从属于某个实体的。

2.实体有自己独立的生命周期,而值对象没有。它总是依附于某个实体。如果实体不存在了,它也将一同消亡。

3.不会出现两个以上的实体引用一个值对象的情况。这也是对2一个保证。如果两个实体有同样的值,那也只可能是有两个值一样的值对象,而不是引用同一个值对象。

 

典型的值对象例子:金钱,地址。

 

对值对象的数据库建模的原则:

1.如果这种值对象只是由一种实体使用并且是一对一的关系,那么使用@Embedded.将值对象的数据列合并到实体表的中。

2.如果有多种实体都会用到这种值对象,或者是一种实体有一组而不是一个值对象,这时候要需要把值对象做成单独的一张表了。注意:这个单独的表是一个关联表,在hibernate中不推荐也不支持把值对象建成一个绝对独立的表,然后以外键或关联表的形式去参照一个实体表。请参见JPwH一书6.3 Mapping collections with annotations。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 22
博文 708
码字总数 110
作品 1
×
猪刚烈
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: