【Hibernate步步为营】--核心对象+持久对象全析(一)
时间:2014-05-09 15:12:13
收藏:0
阅读:369
引言
上篇博客对Hibernate进行了基本的解析,并分析了它的一些特性。Hibernate能够如此的流行也是因为它有诸多优点,任何事物都有两面性,Hibernate虽然流行,但是也有很多缺点,其中最主要的是封装问题,想要使用数据库特性的语句,该框架就显得很不成熟了。那接下来讨论下有关Hibernate的核心运行机制。
一、Hibernate核心
1、核心解析图
从上图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务。应用程序创建的持久化对象收到Hibernate托管,然后将对象的修改同步到数据库中。这种功能有点类似于微软的ADO.NET,通过ADO.NET实现数据的更新及其它工作。
我们来详细的看一下Hibernate的运行时体系结构。在向下继续前我们需要回头看看Hibernate的一些优缺点,Hibernate属于轻量级的框架结构,它能够实现对象模型到关系模型的映射,这种映射有分为两种:一种是比较轻型的体系结构方案,要求应用程序提供自己的JDBC连接并管理自己的事务,如下图中所示:
另一种是比较完全的体系结构,应用程序有关数据库的操作及事务的管理全部交由Hibernate处理,应用程序只关心自己的对象模型即可,正如下图所示:
第二种才是比较完全的Hibernate框架,也是开发人员使用最广泛的。它完全将对象模型和关系模型隔离,开发人员只需要关心自己的对象模型即可,对数据库的管理交由Hibernate处理。
2、核心小介
SessionFactory:是Session的工厂,它对数据库它是线程安全的,可以理解为一个数据库的镜像,所以是重量级的,通常在开发时往往将它封装到一个公共的模块中供其它模块调用。
Session:不是Connection,持久化管理器,使用Hibernate完成增删改查主要用的就是该对象,不是线程安全的,不能共用,在用完后会把connection放回应用程序池,它的声明周期最好和事务保持一致。
二、 持久对象生命周期
应用程序在使用Hibernate框架后,创建的持久对象会经历一整套生命周期来完成数据库的操作,其中主要的三个状态分别是瞬态(Transient)、持久化(Persistent)、脱管(detached)。这三种状态的转换是能够在应用程序中控制的,如下图:
为了能清楚的了解这几种状态,这里使用一个实例来查看下这几种状态下对象的不同,下面状态内的代码,具体步骤如下:
(1)创建Hibernate_session程序集,并添加像相应的jar包;
(2)配置Hibernate,添加相应的实体User类,及它的映射文件,并配置好相应的数据库连接;User类文件的映射文件User.hbm.xml代码:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2014-4-30 15:39:33 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.hibernate.User"> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="password"/> <property name="createTime"/> <property name="expireTime"/> </class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">ab12</property>
<!-- dialect:方言,封装的底层API,类似于Runtime,将数据库转换为配置中的相应的语言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(3)添加静态成员sessionfactory的公共类,用来创建一个SessionFactory及其Session对象;
package com.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class session { private static SessionFactory factory; //声明静态局部变量SessionFactory,数据库镜像 static{ try{ //创建并获取配置数据库的配置文件,默认获取hibernate.cfg.xml Configuration cfg=new Configuration().configure(); factory=cfg.buildSessionFactory(); //构建一个数据库镜像 }catch(Exception e){ e.printStackTrace(); //打印错误信息 } } public static Session getSession(){ return factory.openSession(); //返回创建的session对象 } public static SessionFactory getSessionFactory(){ return factory; //返回相应的SessionFactory } //关闭session对象 public static void closeSession(Session session){ if(session != null){ if(session.isOpen()){ session.close(); } } } }
(4)添加一个Source Folder,并在该文件夹内添加名称为com.hibernate的package包,并在包中添加一个名称为SessionTest的类文件。
package com.hibernate; import java.util.Date; import junit.framework.TestCase; import org.hibernate.Session; import org.hibernate.Transaction; public class SessionTest extends TestCase { }
结语
评论(0)