zoukankan      html  css  js  c++  java
  • 【Hibernate步步为营】--核心对象+持久对象全析(一)

    引言


            上篇博客对Hibernate进行了基本的解析。并分析了它的一些特性。

    Hibernate可以如此的流行也是由于它有诸多长处,不论什么事物都有两面性。Hibernate尽管流行。可是也有非常多缺点,当中最基本的是封装问题,想要使用数据库特性的语句。该框架就显得非常不成熟了。

    那接下来讨论下有关Hibernate的核心执行机制。


    一、Hibernate核心


     1、核心解析图


             一个非常easy的Hibernate体系结构图:
             从上图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务。应用程序创建的持久化对象收到Hibernate托管,然后将对象的改动同步到数据库中。这样的功能有点相似于微软的ADO.NET,通过ADO.NET实现数据的更新及其他工作。

            我们来详细的看一下Hibernate的执行时体系结构。在向下继续前我们须要回头看看Hibernate的一些优缺点。Hibernate属于轻量级的框架结构,它可以实现对象模型到关系模型的映射,这样的映射有分为两种:一种是比較轻型的体系结构方案。要求应用程序提供自己的JDBC连接并管理自己的事务。例如以下图中所看到的:

             还有一种是比較全然的体系结构,应用程序有关数据库的操作及事务的管理所有交由Hibernate处理,应用程序仅仅关心自己的对象模型就可以,正例如以下图所看到的:



           另外一种才是比較全然的Hibernate框架,也是开发者使用最广泛的。

    它全然将对象模型和关系模型隔离。开发者仅仅须要关心自己的对象模型就可以,对数据库的管理交由Hibernate处理。


     2、核心小介


           JTA:Java Transaction,事务管理。实现两阶段的提交协议,可以保证符合规范的事务可以完毕控制。假设要拥有对多个数据库进行事务控制的话必须使用它。包含其他资源。



           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>
    


             Hibernate数据库连接配置代码:

    <?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 {
    
    }
    

    结语


            本文主要针对Hibernate的核心做了初步的解析。Hibernate的核心是由session和Transaction等组成,在开发过程中常常使用,另外还有就是有关持久对象的问题,它的转化是通过方法来控制的。详细的转化过程及方法将会在下篇文章讨论。

  • 相关阅读:
    基于vue-cli快速构建
    '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法
    js / ajax 成功提交后怎么跳转到另外一个页面?
    SpringMVC 拦截器不拦截静态资源的三种处理方式方法
    各种JSON的maven引用
    java版微信公众号支付(H5调微信内置API)
    阿里云MongoDB存储数据
    阿里RocketMq(TCP模式)
    Nginx 简单安装
    Redis-主从复制
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10724366.html
Copyright © 2011-2022 走看看