一、Hibernate核心

1、核心解析图

一个非常简单的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代码:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- Generated 2014-4-30 15:39:33 by Hibernate Tools 3.4.0.CR1 -->
  5. <hibernate-mapping>
  6. <class name="com.hibernate.User">
  7. <id name="id">
  8. <generator class="uuid"/>
  9. </id>
  10. <property name="name"/>
  11. <property name="password"/>
  12. <property name="createTime"/>
  13. <property name="expireTime"/>
  14. </class>
  15. </hibernate-mapping>

Hibernate数据库连接配置代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property>
  9. <property name="hibernate.connection.username">root</property>
  10. <property name="hibernate.connection.password">ab12</property>
  11. <!-- dialect:方言,封装的底层API,类似于Runtime,将数据库转换为配置中的相应的语言 -->
  12. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  13. <mapping resource="com/hibernate/User.hbm.xml"/>
  14. </session-factory>
  15. </hibernate-configuration><span style="color:#cc0000;"><strong>
  16. </strong></span>

(3)添加静态成员sessionfactory的公共类,用来创建一个SessionFactory及其Session对象;

  1. package com.hibernate;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. public class session {
  6. private static SessionFactory factory;  //声明静态局部变量SessionFactory,数据库镜像
  7. static{
  8. try{
  9. //创建并获取配置数据库的配置文件,默认获取hibernate.cfg.xml
  10. Configuration cfg=new Configuration().configure();
  11. factory=cfg.buildSessionFactory();  //构建一个数据库镜像
  12. }catch(Exception e){
  13. e.printStackTrace();    //打印错误信息
  14. }
  15. }
  16. public static Session getSession(){
  17. return factory.openSession();   //返回创建的session对象
  18. }
  19. public static SessionFactory getSessionFactory(){
  20. return factory; //返回相应的SessionFactory
  21. }
  22. //关闭session对象
  23. public static void closeSession(Session session){
  24. if(session != null){
  25. if(session.isOpen()){
  26. session.close();
  27. }
  28. }
  29. }
  30. }

(4)添加一个Source Folder,并在该文件夹内添加名称为com.hibernate的package包,并在包中添加一个名称为SessionTest的类文件。

  1. package com.hibernate;
  2. import java.util.Date;
  3. import junit.framework.TestCase;
  4. import org.hibernate.Session;
  5. import org.hibernate.Transaction;
  6. public class SessionTest extends TestCase {
  7. }

结语

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

核心对象+持久对象全析(1)相关推荐

  1. 核心对象+持久对象全析(3)

    二.状态转化方法 前面说到对象之间的转化过程是通过使用方法来实现的,这些方法是很重要的,先看张图 上面这张图在三篇文章中都有用到,它详细描述了持久对象三种状态的转换过程及具体的转化方法,另外还有垃圾回 ...

  2. 核心对象+持久对象全析(2)

    一.状态解析       Hibernate的持久对象主要分为三个状态,Transient.Persistent.Detached,其中Transient称为瞬态,没有被数据库管理,Hibernate ...

  3. web核心 4-response响应对象 servletContext对象 响应行响应体 请求转发 重新定向 从服务器下载与上传资源 切换验证码 网站统计访问次数

    内容介绍 1 ServletContext对象2 response响应对象 ServletContext对象 概述 ServletContext:servlet的上下文对象(全局管理者) 一个项目有且 ...

  4. 从痴迷数据库SQL语句逐渐走进面向对象化(系统的核心以处理对象为主、淡化数据库概念)...

    几年前写信息管理系统都要设计很多很多表,每个表都是自己建立的,然后喜欢用高   性能.高超的SQL语句搞定很多复杂的商业逻辑问题,那SQL语句又长又复杂,一般人   还读不懂,但是代码很少.性能很高, ...

  5. wxWidgets:持久对象概述

    wxWidgets:持久对象概述 wxWidgets:持久对象概述 使用永久窗口 定义自定义持久化窗口 wxWidgets:持久对象概述 持久对象只是在销毁时自动保存状态并在重新创建时自动恢复状态的对 ...

  6. 【数据库系统】管理持久对象的模式

    持久对象的管理模式 持久对象的管理是应用程序设计的重要问题,解决好这个问题需要好的设计模式集合,如PEAA. 持久对象的管理模式主要有: 标识映射:给内存中的所有持久对象都指定OID,再将这些OID映 ...

  7. Jpa持久对象状态,一级缓存,二级缓存

    1JPA持久对象的状态 1.1. 临时状态(transient):瞬时状态 刚刚用new语句创建,没有和entityManager发生关系 没有被持久化,不处于entityManager中.该对象成为 ...

  8. 第八章 Caché 使用持久对象

    文章目录 第八章 Caché 使用持久对象 保存对象 回滚 保存对象和事务 测试保存对象的存在性 使用ObjectScript测试对象是否存在 使用SQL测试对象是否存在 打开保存的对象 多次调用%O ...

  9. JS对比两个对象键值全等

    比较两个对象的键值是否全等,说的就是字面上的相等,也就是看起来的一模一样的,举个栗子 let o1 = { let o2 = {name: 'joe', name: 'joe' isOld: fals ...

最新文章

  1. ASP.NET 学习笔记_13 viewstate 和 cache
  2. 2020-06-15 有理分式矩阵及其互质分解
  3. mysql 类型解释_MySQL 数据类型说明解释
  4. linux ls使用方法,Linux/Ubuntu ls命令详解使用格式和方法
  5. [转]github中,fork了别人的项目之后,如何将别人新增的分支同步过来?
  6. Java中的推断异常
  7. 开源框架_跨平台开源框架对比介绍
  8. Linux 命令(21)—— cd 命令(builtin)
  9. 前端传递参数,由于控制器层类实现了struts2的ModelDriven而产生的一个异常
  10. python动态创建对象属性_Python学习笔记——动态添加属性与方法
  11. 【CodeVs 6128 Lence的方块们】
  12. 浅谈摄像机视角和焦距
  13. poj-openjudge 1042:Moles 解题报告
  14. 超级计算机还是超级烂尾?天河一号闲置近1年
  15. 重装系统:cdboot:couldn't find ntldr
  16. 在哪下载Mysql数据库的JDBC驱动jar包
  17. Splay(不是Spaly,也不是slay,附两道练(mu)习(ban)题)
  18. 小说阅读器,伪装360加速器
  19. 微信第三方授权登录并在h5中发起支付
  20. Python内置函数 vars()函数

热门文章

  1. python做马尔科夫模型预测法_Python实现HMM(隐马尔可夫模型)
  2. linux命令 查找包含指定字符串的文件
  3. 运行java黑窗口是什么意思_黑窗口运行java文件步骤
  4. OpenShift 4 - 配置OpenShift集群日志环境EFK
  5. 使用SQL Agent和SignalR的每日提醒
  6. 微软解释为什么 Rust 是系统编程的最佳选择
  7. 客户端更新功能实现_exlive1.0|监控客户端功能更新
  8. 解决ionic在手机上拍照图片旋转的问题
  9. mysql清空数据表信息
  10. net java互相调用_Java与.NET的WebServices相互调用