【SSH之旅】一步步学习Hibernate框架(一):关于持久化

在不引用不论什么框架下,我们会通过平庸的代码不停的对数据库进行操作,产生了非常多冗余的可是又有规律的底层代码,这样频繁的操作数据库和大量的底层代码的反复书写极大的浪费了程序人员的书写。就在这样一种情况下,Hibernate框架应运而生了。

事实上Hibernate封装的就是Model模型中的model,封装的这部分又叫持久层。在这层中对对象进行加入、删除、更新、查询等操作就叫做持久化。

持久化的对象有三种状态:Transient Objects、Persist Objects、Detached Objects。

Transient Objects:

使用new操作初始化的对象不会被立马持久化。其状态时瞬时的,不被Session管理,此时,也没有不论什么跟数据库相关联的行为,即数据库中没有这个记录,仅仅要不被其它对象引用,他们的状态将会丢失,并由垃圾回收机制回收。

在下面情况下对象处于此状态:

(1) 当通过new语句刚创建了一个对象,不和数据库中的不论什么记录相应。

(2) Session的delete()方法能使一个持久化对象或游离对象转变为暂时对象。对于游离对象,delete()方法从数据库中删除与它相应的记录;对于持久化对象。delete()方法从数据库中删除与它相应的记录。而且把它从Session的缓存中删除。

Persist Objects:

持久实例是不论什么具有数据库标识的实例。它有持久化管理器Session统一管理。持久化实例在事务中进行操作的。其状态在事务结束时同数据库进行同步。

当事务提交时。通过运行SQL的insert、update、delete语句把内存中的状态同步到数据库中。

Session的很多方法都可以触发Java对象进入持久化状态,比方说Session的save()把暂时对象转变为持久化对象。load()或get()返回的对象处于持久化状态。find()返回的List集合中存放的都是持久化对象。update()、saveOrUpdate()和lock()使游离对象转变为持久化对象。

Detached Objects:

Session被关闭后,持久化对象就变成离线对象。离线表示这个对象不再与数据库保持同步,不再受管理。

当调用Session的close()时,Session的缓存被清,缓存中的全部持久化对象都变为游离对象。evict()可以从缓存中删除一个持久化对象,使它变为游离状态。

实例分析:

项目结构:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFuZGFuem1j/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

hibernate.cfg.xml文件:

配置数据库信息和生成的表的

<!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_first</property>
		<property name="hibernate.connection.username">zhudan</property>
		<property name="hibernate.connection.password">1221</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
	<mapping resource="zhudan/hibernate/User.hbm.xml"></mapping>
	</session-factory>
</hibernate-configuration>

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">
<hibernate-mapping >
	<class name="zhudan.hibernate.User" table="T_User">
		<id name="id" column="UserID">
			<generator class="uuid"/>
		</id>
		<property name="name" column="UserName"></property>
		<property name="password" column="PassWord"></property>
		<property name="createTime" column="CreateTime"></property>
		<property name="expireTime" column="ExpireTime"></property>
	</class>
</hibernate-mapping>

HibernateUtils类:

读取前面配置的hibernate.cfg.xml,建立SessionFactory、Session,关闭Session等。

package zhudan.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class HibernateUtils {

	private static SessionFactory factory;

	static{
		try{
			//读取hibernate.cfg.xml
			Configuration cfg=new Configuration().configure();
			//建立SessionFactory
			factory=cfg.buildSessionFactory();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	//获取Session
	public static Session getSession(){
		return factory.openSession();
	}

	//关闭Session
	public static void closeSession(Session session){
		if(session!=null){
			if(session.isOpen()){
				session.close();
			}
		}
	}

	//SessionFactory
	public static SessionFactory getSessionFactory(){
		return factory;
	}
}

ExportDB类:映射表。将hbm.xml生成相应的ddl。

package zhudan.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class ExportDB {
	public static void main(String[] args){
		//读取hibernate.cfg.xml文件
		Configuration cfg=new Configuration().configure();
		SchemaExport export=new SchemaExport(cfg);
		export.create(true, true);
	}
}

SessionTest类:

package zhudan.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import junit.framework.TestCase;

public class SessionTest extends TestCase {
	public void testSave1(){
		Session session=null;
		//开启事务
		Transaction tx=null;
		try{
			session=HibernateUtils.getSession();
			tx=session.beginTransaction();
			//Transient状态
			User user=new User();
			user.setName("zhudan");
			user.setPassword("zhudan");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			//被session管理。persistent状态。当对象属性改变的时候
			//清理缓存(脏数据)的时候,会和数据库同步
			session.save(user);
			//更新上一条数据
			user.setName("fanglin1");
			session.update(user);
			//提交事务
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}finally{
			HibernateUtils.closeSession(session);
		}
		//detached状态
	}
} 

在这个样例中,当New一个User对象时,状态是Transient Objects,此时数据库中没有这条数据,不被Session管理,当在运行保存时。状态改变为Persist Objects,此时,数据中存在当前数据,被Session管理,一旦事务被提交。运行完此语句后。状态更改为Detached
Objects,此时数据库中存在此数据。被Session管理。

总结:

持久化封装了数据訪问细节。为大部分业务逻辑提供了面向对象的接口,降低了数据库訪问次数,添加了应用程序的运行速度,使其不依赖于底层数据库和上层业务逻辑实现,更换数据库时也仅仅是改动配置文件而不用改动代码。重用性大大提高。

时间: 2024-08-29 15:33:45

【SSH之旅】一步步学习Hibernate框架(一):关于持久化的相关文章

一步步学习Hibernate框架(四):采用jpa实现一对多关联映射(二)

上篇博客已经采用jpa注解来实现了一对多关联映射,将这种关联映射以外键的形式处理,现在来看看怎么以第三张表的形式处理.采用jpa注解来映射数据库要使用的jar包见上篇博客: 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一) 现在看第二种方式:以第三张表的关系来体现 Group.java package com.tgb.zhudan; import java.util.List; import javax.persistence.CascadeType; import j

【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联

一对一的映射在对象模型中是经常见到的,主要是将对象模型转换为关系模型就必须在映射文件中进行配置,重点是<one-to-one>标签的使用,有两种方式,第一是主键关联,第二是唯一外键关联,现在先来看第一种方式. 一对一的关联映射中的主键关联,就是说两个对象具有相同的主键值,以表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅仅是通过表的主键来关联. 上图的Person类和IdCard类之间是一一对应关系,一个人就只能有一个身份证,一个身份证只能对应一个人,那么身份证的

一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)

JPA(Java Persistence API)是Sun官方提出的一种Java持久化规范.为Java开发人员提供了一种对象/关系映射工具,管理Java应用中的关系数据.JPA的总体思想和现有Hibernate.TopLink等ORM框架大体一致.总的来说,JPA包括以下3方面的技术: 第一:ORM映射元数据 JPA支持XML和JDK 注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中. 第二:Java持久化API 用来操作实体对象,执行

JAVA框架之Hibernate框架的学习步骤

首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3.学习一对多和多对多的操作等 4.学习基本查询和查询的优化 本人正在学习hibernate框架,今天是第一天,愿意把自己的学习过程分享给大家,希望大家提出宝贵意见,留言给我,共同进步需要什么软件.资源.例程jar包等的,可以留下邮箱,我晚上会给大家发过去的,谢谢

Hibernate框架(一)——总体介绍

作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的JDBC代码,不再反复的测试我们的SQL语句写的如何.这里这需要我们简单配置,调用框架给我们提供的方法,就可以完成对数据增删改查的,那么Hibernate到底是个什么样的框架呢?如何使用呢?先看一个关于Hibernate框架的知识体系图:  这篇博客,我们来总结一下,Hibernate宏观的认识和,

Hibernate框架(一)总结介绍

作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的JDBC代码,不再反复的测试我们的SQL语句写的如何.这里这需要我们简单配置,调用框架给我们提供的方法,就可以完成对数据增删改查的,那么Hibernate到底是个什么样的框架呢?如何使用呢?先看一个关于Hibernate框架的知识体系图: 这篇博客,我们来总结一下,Hibernate宏观的认识和,环

Hibernate框架之get和load方法的区别

我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get和load这两个方法. 我们都知道这两个方法都能够去加载对象,但是他们之间的区别我们必须要去了解一下,这可能也会成为面试的重点.下面我们 主要分析一下get和load这两个方法的区别: 一.Load加载方式和get加载对象方式的区别: 1.load加载方式: Hibernate在使用Load方法获取

SSH(Struts2+Spring+Hibernate)框架搭建流程&lt;注解的方式创建Bean&gt;

此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一.Hibernate(数据层)的搭建: 实现流程 二.Spring(注入实例)的使用: 实现流程 三.Struts2(MVC)的搭建: 实现流程 这里注意一点问题: Struts2与Hibernate在一起搭建,antlr包,有冲突.MyE

SSH之旅(一)——框架简介

SSH框架是由三个框架集成来的,选择以Spring框架为核心并整合Struts.Hibernate的框架组合,是目前较流行的一种Web应用程序开源集成框架,可以搭建具有可伸缩性.灵活性.易维护型的系统,能简化企业系统的开发.部署和管理. 基本上,SSH组合框架如图1所示,包括表现层.业务逻辑层.数据持久层还有域模型驱动Model. 等到做项目时,在开发过程中使用SSH框架,细节如下. 回过头总结,发现还是第一张图经典,胜过万语千言. UI表示层,通过JSP页面和用户交互,传送Request请求和