一、前言
在学习Hibernate的映射 持久化类部分时,遇到两个概念–实体类型、值类型,一直搞不明白,现在将自己的理解整理一下。
二、概念辨析
2.1前言
当查看域模型时,你将会注意到类之间的一个区别:有些类型看起来更为重要,它们表示了最重要的业务对象(这里的对象一词就是其本身的意思)。例子有Item、Category和User类:这些都是我们要尝试表示的真实环境中的实体。区域模型中呈现的其他类型,比如Address、String和Integer,看起来不那么重要。那么,究竟什么是实体类型,什么又是值类型呢,它们的区别是什么呢。
2.2实体类型
在这里,实体类型没有很严格的定义,下面是将实体类型的特点进行总结对实体类型做的一个笼统的概念定义:
有自己的标识、其实例具有来自许多其他实例的引用、并且拥有独立的生命周期,就称之为实体类型。
2.3值类型
在这里,值类型没有很严格的定义,下面是将值类型的特点进行总结对值类型做的一个笼统的概念定义:
没有自己的标识、其实例只能被单个特定的实例所引用、并且生命周期依赖于引用它的那个实例,就称之为值类型。
2.4二者的理解和辨析
2.4.1下面以一个原型图进行理解:
2.4.1.1图解:
2.4.1.2解析
现有三个实体类:Item、Bid、User,和一个值类型类。
显然物品类Item既可以被拍卖品类Bid引用,也可以被用户类User类引用,而用户地址只能被User类所引用,因为很显然Item和Bid类是没有Address的相关属性的。
2.2.2下面以一个表格进行横向辨析:
比较项 | 实体类型 | 值类型 |
对象中,是否存在用以标识该对象的属性(如果主键是复合主键,可能是多个),而该属性在数据库中有其对应的主键 | 存在,而类中对应主键的属性,则用来标识对 | 没有,因此对象本身没有用来标识对象的属性(但是该类可能会有专属的Table,只是Table中的主键,并不会对应到对象中的任一属性) |
能否被一个以上的对象所引用 | 能,被其他对象引用时,在数据库内通过外键来关联,也正因为可以被一个以上的对象所引用,因此要具备用来标识的属性 | 否 |
生命周期是否独立 | 是 | 否,取决于所依赖的类 |