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

引言

上篇博客对Hibernate进行了基本的解析,并分析了它的一些特性。Hibernate能够如此的流行也是因为它有诸多优点,任何事物都有两面性,Hibernate虽然流行,但是也有很多缺点,其中最主要的是封装问题,想要使用数据库特性的语句,该框架就显得很不成熟了。那接下来讨论下有关Hibernate的核心运行机制。

一、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代码:

<?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步步为营】--核心对象+持久对象全析(一)

时间: 2024-08-26 08:45:01

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

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

上篇文章讨论了Hibernate的核心对象,在开发过程中经常用到的有JTA.SessionFactory.Session.JDBC,其中SessionFactory可以看做数据库的镜像,使用它能够创建Session对象,JTA用来管理事务,在对象模型修改后同步到数据库中,另外还有Hibernate作为持久层它封装了持久层的转化过程,下面着重讨论持久对象的转换过程. 一.状态解析 Hibernate的持久对象主要分为三个状态,Transient.Persistent.Detached,其中Tran

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

上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的,而且是通过使用方法来控制它们的转化过程,具体的转化过程今天就来着重讨论下. 二.状态转化方法 前面说到对象之间的转化过程是通过使用方法来实现的,这些方法是很重要的,先看张图 上面这张图在三篇文章中都有用到,它详细描述了持久对象三种状态的转换过程及具体的转化方法,另外还有垃圾回收器,对象在瞬态和脱管状态下如果长时间不适用将会在某一时刻被Java回收器回收,消亡. 1.

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

Hibernate (开放源代码的对象关系映射框架) 编辑 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hiberna

Hibernate的核心对象关系映射

Hibernate的核心就是对象关系映射: (1)第一掌握映射文件的书写: <hibernate-mapping package="com.bie.po"> </hibernate-mapping> (2)第二掌握如何映射某一个对象,以及class里面主键和普通字段的设置. <class name="User" table="user"> 注意:property的column属性的值不能是sql语句的关键字,比

【Hibernate步步为营】--hql查询之实体对象查询

上篇文章简单介绍了hql它作为Hibernate的查询语言,封装了基本上SQL的所有查询操作,HQL能够实现对数据库文件的增删改查,该篇文章着重讨论HQL实体对象的查询方法. 一.实体对象查询 实体对象查询是hql查询的基础,作为一种对象查询语言,在查询操作时和sql不同,查询字符串中的内容要使用类名和类的属性名来代替.这种查询方法相对简单,只要有SQL功底,使用hql是很简单的,但是有一些问题需要注意,就是查询获取数据不是目的,需要考虑的是如何编写出高效的查询语句,这才是讨论的重点. 1.1

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

三种状态的基本概念: 1.  临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据. 使用new创建的对象,久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据. 已经持久化.增加到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Se

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

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

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

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

关于SSH 持久对象转Json双向关联解析过度的解决办法

小弟是一名被部分程序员所鄙视的培训狗,昨天做项目遇到一个问题,在SSH框架通过ajax向界面传递数据的时候,由于对象之间双向关联导致json解析过度,造成内存溢出,网上搜索了解决办法除了过滤某些关联对象之外就没有别的办法了,我的想法是通过设置解析深度来解决过度抓取的问题,开始也考虑性能问题,最好的解决办法就是做一个视图,单独写一个model .但是又不希望这样繁琐,后来发现换个观点一想,能解决这个过度解析的问题对系统的性能的提升其实也很大了,所以就自己动手准备写一个转换工具类,办法也很明了递归.