引言

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

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

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

一、Hibernate核心

 1、核心解析图

         一个非常easy的Hibernate体系结构图:

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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

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

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

 2、核心小介

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

       SessionFactory:是Session的工厂,它对数据库它是线程安全的。可以理解为一个数据库的镜像,所以是重量级的,通常在开发时往往将它封装到一个公共的模块中供其他模块调用。

        Session:不是Connection,持久化管理器,使用Hibernate完毕增删改查主要用的就是该对象,不是线程安全的。不能共用,在用完后会把connection放回应用程序池,它的声明周期最好和事务保持一致。

二、 持久对象生命周期

        应用程序在使用Hibernate框架后,创建的持久对象会经历一整套生命周期来完毕数据库的操作,当中基本的三个状态各自是瞬态(Transient)、持久化(Persistent)、脱管(detached)。

这三种状态的转换是可以在应用程序中控制的,例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

      为了能清楚的了解这几种状态,这里使用一个实例来查看下这几种状态下对象的不同,以下状态内的代码。详细过程例如以下:

      (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等组成,在开发过程中常常使用,另外还有就是有关持久对象的问题,它的转化是通过方法来控制的。详细的转化过程及方法将会在下篇文章讨论。

【Hibernate步步为营】--核心对象+持久对象全析(一)的更多相关文章

  1. 【Hibernate步步为营】--核心对象+持久对象全析(二)

    上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...

  2. 【Hibernate步步为营】--核心对象+持久对象全析(三)

    上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的.并且是通过用法来控制它们的转化过程.详细的转化过程今天就来着重讨论下 ...

  3. Hibernate的核心对象关系映射

    Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...

  4. hibernate在持久对象的生命周期(三州:自由状态,持久状态,自由状态 之间的转换)

    三种状态的基本概念: 1.  临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据. 使用new创建的对象,久化,没有处于Session中,处于此状态的对象 ...

  5. Hibernate入门(3)- 持久对象的生命周期介绍

    在hibernate中对象有三种状态:瞬时态(Transient). 持久态(Persistent).脱管态或游离态(Detached).处于持久态的对象也称为PO(Persistence Objec ...

  6. Hibernate(开放源代码的对象关系映射框架)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  7. JavaEE之Hibernate(开放源代码的对象关系映射框架)

    Hibernate(开放源代码的对象关系映射框架) 1.简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全 ...

  8. Hibernate一级缓存Session和对象的状态

    建议看原文:https://blog.csdn.net/qq_42402854/article/details/81461496 一.session简介        首先,SessionFactor ...

  9. Hibernate的session缓存和对象的四种状态

    一.session缓存 说session缓存就得说到JAVA对象的生命周期,当没有任何引用指向一个对象时,对象则可以被gc回收,也就是生命周期结束了 而hibernate获取一个对象后,会将对象存入s ...

随机推荐

  1. $.each()和$(selector).each()

    转载:http://www.jb51.net/article/65215.htm $.each()与$(selector).each()不同, 后者专用于jquery对象的遍历, 前者可用于遍历任何的 ...

  2. SSM(一):spring-ioc

    一.java代理模式 java代理模式是ioc的前置知识.代理模式非常简单,看代码就一目了然了. public interface role { public void makeMoney(); } ...

  3. 深入理解CSS3 gradient斜向线性渐变——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3639 一.问题没有想 ...

  4. Thinkphp5+PHPExcel实现批量上传表格数据

    1.首先要下载PHPExcel放到vendor文件夹下,我的路径是:项目/vendor/PHPExcel/,把下载的PHPExcel文件放在这里 2.前端代码 <!DOCTYPE html> ...

  5. element-ui button组件 radio组件源码分析整理笔记(一)

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  6. 2017年5月24日 HTML 基础知识(二)

    1 快捷方式:html:xt +tab   过渡XHTML html:xs+tab  严格XHTML !+tab  html5的标签结构 2.Charset   编码 <meta charset ...

  7. React-Native-Android-Studio整合开发+环境配置+官方实例

    linux下React Native开发环境搭建,使用Android-studio工具进行React Native整合开发. 参考React Native的官方文档,通过图文详细记录开发过程.可以查看 ...

  8. 自定义适用于手机和平板电脑的 Dynamics 365(五):可视控件

    使用 适用于手机的 Dynamics 365 和平板电脑中的可视控件帮助移动用户更快地输入 Dynamics 365 数据并提供更丰富的可视体验. 此组自定义控件包括滑块.开关.星数评级.视频嵌入以及 ...

  9. cordova app强制横屏

    非常简单,只需要在config.xml里加上这行: <preference name="Orientation" value="landscape" /& ...

  10. [Android] ACTION_GET_CONTENT与ACTION_PICK的区别

    参考:AndroidSDK/docs/reference/android/content/Intent 看到相关代码,对这两个参数的区别有点搞不清. 原文地址请保留http://www.cnblogs ...