Hibernate映射关系----复合主键、Component、集合映射
复合主键映射
多个字段构成主键,在现实中不太常用。一般情况下把主键相关字段拿出来,作为属性单独构成一个类,并生成geter和seter方法,最重要的是单独构成的这个类必须实现序列化接口且覆盖equals和hashcode方法。
比如:FiscalYearPeriod由复合主键构成,代码:
主键相关字段构成的单独类FiscalYearPeriodPK,代码:FiscalYearPeriod实体类的映射文件FiscalYearPeriod.hbm.xml。composite-id标签里面所映射的就是FiscalYearPeriod类的两个复合主键,在对象模型中,FiscalYearPeriod持有FiscalYearPeriodPK的引用。Component映射
也叫组件映射。在对象模型中,为了考虑复用率,设计类一般都会从细粒度出发,尽量做到含义明确,层次分明。而关系模型的设计与对象模型恰恰相反,为了性能、便捷等因素,一般是采用粗粒度的。
如例:
User和Employee的映射文件。
从对象模型看,Contact是User和Employee的逻辑组成部分,两个实体类分别持有它的引用,它与实体类主要差别在于没有id,Component(Contact)在DDD中称为值类。从关系模型看,最终分成了两张表,分别保存各自的数据,比对象模型粒度要粗一些。用<Component>标签完成了Component映射。
集合映射
下面完成set、list、array、map的映射。其原理是把集合映射成一张表。
实体类对象:
package com.snail.hibernate;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;@SuppressWarnings("rawtypes")public class CollectionMapping {private int id;private String name;private Set setValues = new HashSet();private List listValues = new ArrayList();private String[] arrayValues;private Map mapValues;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set getSetValues() {return setValues;}public void setSetValues(Set setValues) {this.setValues = setValues;}public List getListValues() {return listValues;}public void setListValues(List listValues) {this.listValues = listValues;}public String[] getArrayValues() {return arrayValues;}public void setArrayValues(String[] arrayValues) {this.arrayValues = arrayValues;}public Map getMapValues() {return mapValues;}public void setMapValues(Map mapValues) {this.mapValues = mapValues;}}映射文件:
<list-index>标签是防止放入表中的集合元素顺序打乱,因为Set内的元素是没有顺序的,因此不需要<list-index>标签。