博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于值对象与实体的再讨论
阅读量:6622 次
发布时间:2019-06-25

本文共 847 字,大约阅读时间需要 2 分钟。

hot3.png

在领域模型中,实体与值对象的概念非常重要,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。

转载于:https://my.oschina.net/pangzhuzhu/blog/327034

你可能感兴趣的文章
阅读笔记1
查看>>
编译原理是什么?有什么用?
查看>>
CSS3与动画有关的属性transition、animation、transform对比
查看>>
vue的手机端框架mint-ui头部header组件实现返回到上一个浏览页面
查看>>
打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹
查看>>
数据库事务(二)
查看>>
ArcEngine判断要素集是否存在
查看>>
C#读写txt文件的两种方法介绍
查看>>
项目构建工具之maven01
查看>>
《Python网络数据采集》笔记之采集
查看>>
母版页和相对路径
查看>>
查看oracle数据库的连接数以及用户
查看>>
C#串口通信
查看>>
ELK的端口以及加入x-pack的密码问题
查看>>
转帖01
查看>>
[LeetCode] Binary Tree Upside Down
查看>>
crontab详解
查看>>
前端之Bootstrap(二)
查看>>
SortedDictionary构建泛型排序字典
查看>>
libgdx应用的生存周期
查看>>