Hibernate 关联映射
ORM(Object Relational Mapping)对象/关系映射
说到Hibernate的关联映射就必须要提一提ORM了。那么ORM是什么呢,其是一种持久化技术,他在对象模型和关系型数据库之间建立对象关系,通过操作JavaBean对象来完成对数据库的操作!
注意:ORM是概念化的并不是实际存在的,可以理解为其是一种编程思想,而Hibernate框架就是该思想的实现产品!
配置Po对象(和数据表绑定的持久化对象)的关联关系
从上面说到ORM可以在对象模型和数据库之间建立对应关系而在Hibernate中该关系的建立可以通过xml文件来进行配置详情请参考《hibernate集成》,该关系的建立是ORM持久化技术实现的基础,有了该关系的配置才可以使ORM持久化技术成为可能!
从《hibernate集成》中我们可以对javaBean进行和数据库表对应关系的配置但是如果两张表存在主外建关系比如:员工有所属的部门在员工表中存在部门编号的外键列时又该如何配置?
解决方案1:
按照数据表的结构创建实体类(员工实体类中存放的是部门编号没有部门名称)
解决方案2:
在员工实体类中添加部门实体类的引用
从上面的两个解决方案中显然第二种解决方案要更靠谱一点以为如果是第一种方案的话如果查询员工信息并且显示该员工的部门名称是又该怎么办?但是第二种方案中的部门实体类的类型使我们自己定义的类型数据表中并没有该类型,如何来配置?这时就需要对两个实体类进行关联关系的配置了!
配置多对一单项关联关系
上面所遇到的问题就可以通过多对一单项关联配置来解决。在员工实体类的xml文件配置中将部门实体类的变量进行如下配置:
<many-to-one name="部门实体类变量" column="员工表中关联部门表的外键列的名称" class="部门实体类的全名称(如:cn.wz.entity.Dept)" />其中<many-to-one>元素建立了员工表和部门表的主外建之间的映射。它主要包含以下属性:
- name:设定持久化类的属性名,此处为员工实体类中引用部门实体类变量的属性。
- column:设定持久化类的属性对应的表的外键,此处为员工表的外键。
- class:设定持久化类的属性的类型,此处为部门实体类的类型。
配置双向的一对多关联
如果想要在员工实体类中保存其关联的部门实体类并且部门实体类中保存与之关联的员工(多个)则可以配置双向的一对多关联
在配置多对一单项关联的基础上在部门实体类中添加员工实体类集合的属性并在其xml配置文件中文件添加如下配置:
<set name=”引用员工实体类集合的属性名称”> <key column=”员工表中与部门表关联的外键列名称”></key> <one-to-many class=”员工实体类的全名称(如:cn.wz.entity.Emp)”/> </set>set元素的name属性:设定持久化类的属性名。此处为引用员工实体类集合的属性名称。
set元素还包含两个子元素:
- Key元素:column 属性设定与之所关联的持久化类对应的表的外键,此处为员工表中与部门表关联的外键列名称
- ons-to-many元素:class属性设定与之关联持久化类。此处为员工实体类。
配置单向多对多关联
配置单项多对多关联与配置一对多关联类似也是使用set元素,在此时用员工(EMP)和项目(PROJECT)来举例
如在员工表中保存其参与的多个项目
员工实体类中的代码如下:
public calss Emp implements java.io.Serializable{ //省略Emp类中的其他属性 private Set<Project> projects=new HashSet<Project>(0); //省略Emp类中的构造 //省略getter和setter方法 }在其xml配置文件中加入如下配置
<set name=”projects”table=“PROEMP”> <key column=”REMPID”/> <many-to-many class=”cn.wz.entity.Project”column=”RProjectID”/> </set>其中:
set元素的table属性指定关系表的名称为PROJECT
set子元素key元素的column属性指定PROEMP表的外键REMPID,用来参照EMP表
many-to-many子元素的class属性指定projects集合中存放的是Project对象,cloumn属性指定PROEMP表的外键RProjectID用来参照PROJECT表
配置双向多对多关联
配置双向多对多关联与上面一样只需将REMPID和RProjectID交换位置即可
注意:在使用多对多关联时Hibernate会自动在数据库中创建PROEMP表来连接员工表和项目表该表只有两列REMPID和RProjectID并且REMPID列为员工表的外键、RProjectId为部门表的外键