关于值对象与实体的再讨论

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

你可能感兴趣的:(Hibernate,Collections,领域模型,Annotations,数据库建模)