李苹 孙若贤
摘要:Hibernate可以用映射关联的方法解决面向对象技术与关系数据库技术之间不匹配的问题,将应用程序中的对象数据持久化到关系数据库中。该文分析了Hibernate的工作原理、CRUD实现技术,给出了关联关系的映射实例。
关键词:Hibernate;数据持久化
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)03-0012-02
Java程序与关系数据库通信,可以使用JDBC编程技术,将SQL语句嵌入到Java宿主语言中混合编程,程序中的代码及SQL语句包含了对象模型与关系数据模型之间的映射关系。然而,嵌入了SQL语句的Java语言降低了程序的可读性及独立性,程序员需要面向对象与面向过程的思维转换。利用Hibernate技术可以用面向对象编程思维来操纵数据库,达到操作对象就是操作数据库的目标,可以把SQL语句从程序代码中分离出去,实现将内存中的一个对象映射成关系数据库表中一条记录的持久化操作。
1 Hibernate的运行原理
Hibernate是属于持久化的概念,是将内存中的数据模型转换为存储模型,将实体类的定义、类的属性与数据库中的表和字段映射起来。
Hibernate通过Configuration类加载配置文件到内存,读取并解析配置文件,读取并解析映射信息,创建SessionFactory对象。每个SessionFactory类的实例对应一个数据库,并负责创建Session实例。Session负责管理所有与持久化相关的CRUD操作。
2 Hibernate实现CRUD应用
用Hibernate实现对关系模式:学生(学号,姓名,性别)的持久化操作,步骤如下:
(1)配置hibernate.cfg.xml文件,用于存放连接数据库的有关信息。
……
(2)创建持久化类,将Java对象永久保存在数据库中,当程序再次运行时重新加载到内存,并重新构造出对象。创建一个与学生表相关的持久化类,代码如下:
public class Student {
private Integer sid;
private String sno;
private String sname;
private String ssex;
public Integer getSid() {
return sid; }
public void setSid(Integer sid) {
this.sid = sid; }
public String getSno() {
return sno; }
public void setSno(String sno) {
this.sno = sno; }
public String getSname() {
return sname; }
public void setSname(String sname) {
this.sname = sname; }
public String getSsex() {
return ssex; }
public void setSsex(String ssex) {
this.ssex = ssex; }}
(3)创建扩展名为hbm.xml的 XML文件来指定对象和关系数据之间的映射关系,在运行时,Hibernate将根据这个映射文件,将Student类映射到STUDENT表。
(4)CRUD操作
调用Session的save()方法,把对象持久化到数据库中,相当于对表执行INSERT操作。调用createQuery()方法对数据库进行查询,相当于对表上执行SELECT操作。调用get()方法加载对象,可以修改对象的属性,相当于对表执行UPDATE操作。调用delete()方法删除参数指定的对象,相当于对表执行DELETE操作。
3 Hiberbate映射实体关联关系应用
在数据持久化操作中,存在实体关联关系的映射,可以将数据库中的一对一、一对多、多对多联系映射到具体的对象操作中。实例如下:
关系模式学校(学校编号,名称)与校长(校长编号,姓名)存在一对一的联系,表明一所学校只有一个校长,一个校长只有在一所学校任职。可以采用基于外键的双向一对一关联映射。在创建的学校实例类中加入校长编号属性,在校长类中加入学校编号属性。并实现该属性的setXxx()和getXxx()方法,分别用来获取关联和设置关联的对象,即可以从学校查询到校长,也可以从校长查询到任职学校。在校长类的对象关系映射文件中通过many-to-one元素映射学校编号属性,指定unqiue的属性为true,表示校长实体到学校实体的一对一联系。在学校类的对象映射文件中通过one-to-one元素映射从学校实体到校长实体的一对一关系。
关系模式学生(学号,姓名,性别)与班级(班级号,班级名)存在多对一的联系,表明一个学生只能在一个班级,一个班级可以有多个学生。可用双向一对多关系映射。在班级类中定义集合类型的属性,用来存储学生对象,在学生类中定义班级类的属性。在学生类的对象映射文件中用many-to-one元素指定被关联的类的属性为班级,外键为班级号。在班级类的对象映射文件中用one-to-many元素映射学生类,用集合的方式进行属性设置。
关系模式课程(课程,课程名)与学生存在多对多的联系,表明一个学生可以选多门课程,一门课程可以有多个学生选修。可用双向多对多关联映射。在学生类中定义集合类型的课程属性,用来存储课程类对象。在课程类中定义集合类型的学生属性,用来存储学生类对象。在学生类的对象映射文件中用many-to-many元素指定被关联的类的属性为班级,用set元素映射集合属性课程。在班级类的对象映射文件中用many-to-many元素指定被关联的类的属性为学生,用set元素映射集合属性学生。
4 结束语
使用Hibernate技术,程序员可以用面向对象的方法访问数据库,使数据的管理和操作相分离,提高开发效率。
参考文献:
[1] 许勇,王黎.Struts 2+Hibernate+Spring整合开发深入剖析与落伍应用[M].北京:清华大学出版社,2013.
[2] 王国辉,马文强.Hibernate应用开发完全手册[M].北京:人民邮电出版社,2007.
[3] 工业和信息化部人才交流中心蓝桥杯软件大赛专家委员会.使用Hibernate框架轻松连接数据库[M].北京:电子工业出版社,2013.
[4] 孙卫琴.Hibernate逍遥游记[M].北京:电子工业出版社,2010.