论文部分内容阅读
【摘要】hibernate框架用于提供一种持久化的对象-关系映射模型解决方案,为此,本文在hibernate框架的基础上对几种关联映射进行了研究,提出了一种基于hibernate关联映射模型,并将其应用到了信息系统的开发中,取得了通用性效果。
【关键词】hibernate;持久化层;ORM模型;信息系统开发
一、引言
目前使用的数据库都是关系型数据库,而java本质上是一种面向对象的语言,对象在存储和读取时使用SQL和JDBC进行数据库操作,降低了编程的效率以及系统的可维护性。如何设计一个低耦合,高内聚并且具有良好的可维护性、可扩展性的系统一直是软件工程领域重点研究的问题,在java web应用开发中引入优秀的框架使之成为可能。[1]
框架(Framework)是可重用的半完成的应用程序,可以用来产生专门的定制程序。[2]框架一般具有即插即用的可重用性,成熟的稳定性以及良好的团队协作性。[3]Hibernate技术框架本质上是一个提供数据库服务的中间件。[4]ORM也可以理解为一种规范,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系型数据库的映射。基于ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。ORM框架是面向对象程序设计语言与关系数据库发展不同步时的中间解决方案。[5]
二、hibernate简介
Hibernate利用反射机制在运行时实现持久化一个对象的各种操作,保证了源码的简练和完全的面向对象风格。[1]Hibernate全局配置文件hibernatecfg.xml中描述数据库连接信息,注册系统所有的对象-关系映射文件(*.hbm.xml),以便应用启动后就完成了数据库的连接和所有映射文件的加载工作。[1]
当启动Hibernate框架时,Hibernate的配置文件对数据库进行配置同时加载映射文件,通过映射文件把持久化对象和数据库表之间建立一个映射关系。该映射文件描述了数据库表中的信息,也描述了对应的持久化类对象的信息,同时,Hibernate内部封装了JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API。[6]
三、ORM简介
ORM主要用于解决面向对象编程语言和关系数据库之间不协调的问题。
对象关系映射(Object Relational Mapping,ORM)是将java对象的状态映射到数据库上,即将java中的对象与对象的关系对应为关系数据库中表与表之间的关系,以便提供透明持久化操作。ORM的目标是简化持久化模型中的实体对象,使开发人员避免编写数据访问的代码。它的作用是在关系型数据库和对象之间做一个映射。在引入一个ORM后,可以用ORM保存,删除,读取对象,ORM负责生成SQL,开发人员只需要关心对象。[7]
四、Hibernate的关联映射
Hibernate的核心任务是根据映射文件中配置信息建立实体对象与关系数据库二维表之间的映射。Hibernate首先由SessionFactory将一个普通的java对象(POJO)转换成持久化类,再通过ORM在数据库表和类的对象之间建立映射,通过JDBC,JNDI等数据库接口访问数据库[2],关联映射的定义在这里尤为重要。
1.持久化类及持久化对象
Hibernate的作用是使普通的java对象成为持久化类。持久化对象(persistent object)是一个完全符合java bean规范的纯java对象,它包含符合统一标准的属性和方法,其属性只可以通过自身的get和set方法访问,这样对外隐藏了内部实现的细节,规范了事务处理部分中每个属性所对应的数据库字段的数据操作。[3]
Hibernate允许持久化对象拥有复杂的结构如混合类型,集合和属性,还可以拥有用户自定义的类型。这些持久化对象可以有效的反映出数据库模式的复杂结构。[8]
2.持久化对象的映射定义
映射文件*.hbm.xml包含了对象关系映射所需的元数据。元数据中包含了持久化类的声明及类中各个属性到数据库表中各个字段的映射关系。其属性可以作为一般值存在,也可以指向其他实体的关联,在关系型数据库中体现为数据表的外键。[3]持久化类及持久化对象的关系映射代码如下:
public class TableMany implements java.io.Serializable {
// Fields
private Integer priKeyMany;
private TableOne tableOne;
// Constructors
/** default constructor */
public TableMany() {
}
/** minimal constructor */
public TableMany(Integer priKeyMany) {
this.priKeyMany = priKeyMany;
}
/** full constructor */
public TableMany(Integer priKeyMany,TableOne tableOne) {
this.priKeyMany = priKeyMany;
this.tableOne = tableOne;
}
// Property accessors
public Integer getPriKeyMany() {
return this.priKeyMany;
}
public void setPriKeyMany
(Integer priKeyMany) {
this.priKeyMany = priKeyMany;
}
public TableOne getTableOne() {
return this.tableOne;
}
public void setTableOne(TableOne tableOne) {
this.tableOne = tableOne;
}
}
public class TableOne implements java.io.Serializable {
// Fields
private Integer priKeyOne;
private String column1;
private String column2;
private Set tableManies = new HashSet(0);
// Constructors
/** default constructor */
public TableOne() {
}
/** minimal constructor */
public TableOne(Integer priKeyOne) {
this.priKeyOne = priKeyOne;
}
/** full constructor */
public TableOne(Integer priKeyOne,String column1,String column2,
Set tableManies) {
this.priKeyOne = priKeyOne;
this.column1 = column1;
this.column2 = column2;
this.tableManies = tableManies;
}
// Property accessors
public Integer getPriKeyOne() {
return this.priKeyOne;
}
public void setPriKeyOne(Integer priKeyOne) {
this.priKeyOne = priKeyOne;
}
public String getColumn1() {
return this.column1;
}
public void setColumn1(String column1) {
this.column1 = column1;
}
public String getColumn2() {
return this.column2;
}
public void setColumn2(String column2) {
this.column2 = column2;
}
public Set getTableManies() {
return this.tableManies;
}
public void setTableManies(Set tableManies) {
this.tableManies = tableManies;
}
}
3.持久化操作
数据在持久化操作前,利用Hibernate的Session从数据库中存取对象记录。首先从SessionFactory中获取一个Hibernate的Session工作单元。然后从SessionFactory类中获取Session实例,得到全局的SessionFactory,从而可以从中获取Session进行对象的操作。[3]持久化操作代码如下:
session = HibernateSessionFactory.getConfiguration().buildSessionFactory().openSession();
hql=hql statement;
query = session.createQuery(hql);
query.setString(0,parameter);
persistent class name persistent object = (persistent class name)query.uniqueResult();
…
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.save(persistent object);
tx.commit();
}catch(Exception e)
{
if(tx!=null)
{
tx.rollback();
}
}finally
{
session.close();
}
五、总结
ORM的作用是在关系型数据库和业务实体对象之间做一个映射,程序员在具体操作业务对象的时候,只需要像操作对象一样,无需使用SQL语句即可操作,ORM框架应该应当遵循简单、传达性和精确性的三个核心原则[9]。对于建模者来说,可以很方便的开发信息系统;对于业务实体的设计者来说,也可以在脱离数据结构的基础上使用业务实体并建筑企业级的应用系统。
参考文献
[1]李雷孝,刘志强,杜慧敏,冀强.Struts和Hibernate整合框架研究与应用[J].内蒙古工业大学学报,Vol 29,No.3,2010,pp186-190.
[2]Ted Husted,Cedric Dumoulin,George Franciscus,et al.Struts in Action[M].America:Manning Publications Co,2003.
[3]陈辉,赵宏升,张艳春.Struts+Spring+Hibernate框架的整合实现[J].河南大学学报,Vol.40,No.6,Nov.2010,pp642-645.
[4]龚雪冰,何彪,基于Tapestry+Spring+hibernate框架的Web应用[J].计算机技术与发展,2007,17(4),pp131-135.
[5]李德兵,尹站文,王洪明.JavaEE基于Hibernate的ORM框架[J].电子技术,pp7-8,3.
[6]刘斌,王最.SSH框架在OA开发中的应用[J].计算机技术与发展,Jan 2010,Vol.20,No.1,pp151-154.
[7]王海涛,贾宗璞,基于Struts和Hibernate的Web应用开发[J].计算机工程,2011,Vol.37,No.9,pp112-114.
[8]高瞻,锁志海.基于Spring+Struts+Hibernate框架的网络评比系统[J].微计算机信息,2010,26(5-3):179-181.
[9]http://www.cnblogs.com/godspeed_yjx/archive/2008/09/29/1301829.html.
本文系保定学院2010年科研基金项目成果(项目编号:2010Z13)。
作者简介:吉雪芸(1978—),女,江苏泰兴人,硕士,保定学院数学与计算机系讲师,研究方向:计算机软件技术。
【关键词】hibernate;持久化层;ORM模型;信息系统开发
一、引言
目前使用的数据库都是关系型数据库,而java本质上是一种面向对象的语言,对象在存储和读取时使用SQL和JDBC进行数据库操作,降低了编程的效率以及系统的可维护性。如何设计一个低耦合,高内聚并且具有良好的可维护性、可扩展性的系统一直是软件工程领域重点研究的问题,在java web应用开发中引入优秀的框架使之成为可能。[1]
框架(Framework)是可重用的半完成的应用程序,可以用来产生专门的定制程序。[2]框架一般具有即插即用的可重用性,成熟的稳定性以及良好的团队协作性。[3]Hibernate技术框架本质上是一个提供数据库服务的中间件。[4]ORM也可以理解为一种规范,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系型数据库的映射。基于ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。ORM框架是面向对象程序设计语言与关系数据库发展不同步时的中间解决方案。[5]
二、hibernate简介
Hibernate利用反射机制在运行时实现持久化一个对象的各种操作,保证了源码的简练和完全的面向对象风格。[1]Hibernate全局配置文件hibernatecfg.xml中描述数据库连接信息,注册系统所有的对象-关系映射文件(*.hbm.xml),以便应用启动后就完成了数据库的连接和所有映射文件的加载工作。[1]
当启动Hibernate框架时,Hibernate的配置文件对数据库进行配置同时加载映射文件,通过映射文件把持久化对象和数据库表之间建立一个映射关系。该映射文件描述了数据库表中的信息,也描述了对应的持久化类对象的信息,同时,Hibernate内部封装了JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API。[6]
三、ORM简介
ORM主要用于解决面向对象编程语言和关系数据库之间不协调的问题。
对象关系映射(Object Relational Mapping,ORM)是将java对象的状态映射到数据库上,即将java中的对象与对象的关系对应为关系数据库中表与表之间的关系,以便提供透明持久化操作。ORM的目标是简化持久化模型中的实体对象,使开发人员避免编写数据访问的代码。它的作用是在关系型数据库和对象之间做一个映射。在引入一个ORM后,可以用ORM保存,删除,读取对象,ORM负责生成SQL,开发人员只需要关心对象。[7]
四、Hibernate的关联映射
Hibernate的核心任务是根据映射文件中配置信息建立实体对象与关系数据库二维表之间的映射。Hibernate首先由SessionFactory将一个普通的java对象(POJO)转换成持久化类,再通过ORM在数据库表和类的对象之间建立映射,通过JDBC,JNDI等数据库接口访问数据库[2],关联映射的定义在这里尤为重要。
1.持久化类及持久化对象
Hibernate的作用是使普通的java对象成为持久化类。持久化对象(persistent object)是一个完全符合java bean规范的纯java对象,它包含符合统一标准的属性和方法,其属性只可以通过自身的get和set方法访问,这样对外隐藏了内部实现的细节,规范了事务处理部分中每个属性所对应的数据库字段的数据操作。[3]
Hibernate允许持久化对象拥有复杂的结构如混合类型,集合和属性,还可以拥有用户自定义的类型。这些持久化对象可以有效的反映出数据库模式的复杂结构。[8]
2.持久化对象的映射定义
映射文件*.hbm.xml包含了对象关系映射所需的元数据。元数据中包含了持久化类的声明及类中各个属性到数据库表中各个字段的映射关系。其属性可以作为一般值存在,也可以指向其他实体的关联,在关系型数据库中体现为数据表的外键。[3]持久化类及持久化对象的关系映射代码如下:
public class TableMany implements java.io.Serializable {
// Fields
private Integer priKeyMany;
private TableOne tableOne;
// Constructors
/** default constructor */
public TableMany() {
}
/** minimal constructor */
public TableMany(Integer priKeyMany) {
this.priKeyMany = priKeyMany;
}
/** full constructor */
public TableMany(Integer priKeyMany,TableOne tableOne) {
this.priKeyMany = priKeyMany;
this.tableOne = tableOne;
}
// Property accessors
public Integer getPriKeyMany() {
return this.priKeyMany;
}
public void setPriKeyMany
(Integer priKeyMany) {
this.priKeyMany = priKeyMany;
}
public TableOne getTableOne() {
return this.tableOne;
}
public void setTableOne(TableOne tableOne) {
this.tableOne = tableOne;
}
}
public class TableOne implements java.io.Serializable {
// Fields
private Integer priKeyOne;
private String column1;
private String column2;
private Set tableManies = new HashSet(0);
// Constructors
/** default constructor */
public TableOne() {
}
/** minimal constructor */
public TableOne(Integer priKeyOne) {
this.priKeyOne = priKeyOne;
}
/** full constructor */
public TableOne(Integer priKeyOne,String column1,String column2,
Set tableManies) {
this.priKeyOne = priKeyOne;
this.column1 = column1;
this.column2 = column2;
this.tableManies = tableManies;
}
// Property accessors
public Integer getPriKeyOne() {
return this.priKeyOne;
}
public void setPriKeyOne(Integer priKeyOne) {
this.priKeyOne = priKeyOne;
}
public String getColumn1() {
return this.column1;
}
public void setColumn1(String column1) {
this.column1 = column1;
}
public String getColumn2() {
return this.column2;
}
public void setColumn2(String column2) {
this.column2 = column2;
}
public Set getTableManies() {
return this.tableManies;
}
public void setTableManies(Set tableManies) {
this.tableManies = tableManies;
}
}
3.持久化操作
数据在持久化操作前,利用Hibernate的Session从数据库中存取对象记录。首先从SessionFactory中获取一个Hibernate的Session工作单元。然后从SessionFactory类中获取Session实例,得到全局的SessionFactory,从而可以从中获取Session进行对象的操作。[3]持久化操作代码如下:
session = HibernateSessionFactory.getConfiguration().buildSessionFactory().openSession();
hql=hql statement;
query = session.createQuery(hql);
query.setString(0,parameter);
persistent class name persistent object = (persistent class name)query.uniqueResult();
…
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.save(persistent object);
tx.commit();
}catch(Exception e)
{
if(tx!=null)
{
tx.rollback();
}
}finally
{
session.close();
}
五、总结
ORM的作用是在关系型数据库和业务实体对象之间做一个映射,程序员在具体操作业务对象的时候,只需要像操作对象一样,无需使用SQL语句即可操作,ORM框架应该应当遵循简单、传达性和精确性的三个核心原则[9]。对于建模者来说,可以很方便的开发信息系统;对于业务实体的设计者来说,也可以在脱离数据结构的基础上使用业务实体并建筑企业级的应用系统。
参考文献
[1]李雷孝,刘志强,杜慧敏,冀强.Struts和Hibernate整合框架研究与应用[J].内蒙古工业大学学报,Vol 29,No.3,2010,pp186-190.
[2]Ted Husted,Cedric Dumoulin,George Franciscus,et al.Struts in Action[M].America:Manning Publications Co,2003.
[3]陈辉,赵宏升,张艳春.Struts+Spring+Hibernate框架的整合实现[J].河南大学学报,Vol.40,No.6,Nov.2010,pp642-645.
[4]龚雪冰,何彪,基于Tapestry+Spring+hibernate框架的Web应用[J].计算机技术与发展,2007,17(4),pp131-135.
[5]李德兵,尹站文,王洪明.JavaEE基于Hibernate的ORM框架[J].电子技术,pp7-8,3.
[6]刘斌,王最.SSH框架在OA开发中的应用[J].计算机技术与发展,Jan 2010,Vol.20,No.1,pp151-154.
[7]王海涛,贾宗璞,基于Struts和Hibernate的Web应用开发[J].计算机工程,2011,Vol.37,No.9,pp112-114.
[8]高瞻,锁志海.基于Spring+Struts+Hibernate框架的网络评比系统[J].微计算机信息,2010,26(5-3):179-181.
[9]http://www.cnblogs.com/godspeed_yjx/archive/2008/09/29/1301829.html.
本文系保定学院2010年科研基金项目成果(项目编号:2010Z13)。
作者简介:吉雪芸(1978—),女,江苏泰兴人,硕士,保定学院数学与计算机系讲师,研究方向:计算机软件技术。