Hibrernate 数据对象状态

标签: hibrernate 数据 对象 | 发表时间:2013-09-27 21:59 | 作者:
出处:http://www.iteye.com

Hibernate 中数据对象状态概念介绍

一、 数据对象在Session中的状态:
1、理解Session的缓存:Session接口是Hibernate向应用程序
提供操作数据库的主要接口,它提供了基本的增、删、改、查 方法;
Session具有一个缓存,Hibernate的缓存包括Session的缓存和SessionFactory的缓存;
Session 为一级缓存,SessionFactory 为二级缓存;

二、Hibernate对象的三种状态
1、临时态:(瞬时态)
特征:a、不处于Session 的缓存中,即:不被任何一个Session实例关联;
b、数据库中没有对应的记录;
java对象进入瞬时态的情况:
a、刚通过new语句创建对象的时候,此对象处于瞬时状态,此时数据库中
与之没有对应的记录;
b、Session的delete();方法能使一个持久化对象或游离对象转为瞬时对象;

2、持久态:
特征:a、位于Session实例的缓存中;
b、持久化对象和数据库中的相关记录对应;
c、Session在清理缓存的时候,会根据持久化对象的属性变化,来同步更新数据库;
java对象进入持久态的情况:
Session的save();方法把临时对象转为持久对象;
Session的load(); get();方法返回的对象总是持久状态;
Session的find();方法返回的List集合中存放的是持久化对象;
Session的update(); saveOrUpdate();方法使游离对象转
变为持久对象;

3、游离态:
特征:
不再位于Session缓存中;
游离对象是由持久对象转变过来的,因此在数据库中可能还存在与之对应的记录;

Session的下列方法使持久对象转变为游离对象:
调用Session的close()方法时,Session缓存被清空,缓存中的所有持久化对象
都变成游离对象;
Session的evict();方法能够从缓存中清除一个持久化对象,使它变成游离态;


三、相关Session中动作的解释:
saveOrUpdate();临时态调用save(); 游离态时调用update();  最终的状态持久态;

Session中的查询方法:
Hibernate中提供了两种OID检索方式,来获得对应的持久化对象:
1、load(); 对象不存在时抛出异常; 支持延时加载;
延时加载:就是获取到持久对象之后,延迟的关闭Session; 提前关闭获取不到持久态数据对象,关闭后为游离态;
2、get(); 对象不存在时返回null;总是立即加载对象;

clear();用于清空缓存,清空所有的持久化对象;
语法:Session.clear();

evict(); 该方法是用与清楚缓存的,清楚一个;

代码如下:



package com.svse.dao;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.svse.entity.TDept;
import com.svse.util.HibernateSessionFactorySupportImpl;

//Session 中数据对象状态的测试
public class DeptDao_state extends HibernateSessionFactorySupportImpl {
	
	//动作:增加
	public void addDept_t2(TDept dept){
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction ctx = session.beginTransaction();
		session.save(dept);
		ctx.commit();
		
		//事务提交之后:数据没有写入到数据库
		dept.setPName("泰国");
		session.close();
	}
	
	//动作:增加
	public void addDept_t1(TDept dept){
		
		this.beginTransaction();		//第一种状态:临时态
	
		/****************************情况一*****************************************/
		//在进入持久态进行进行数据的修改:
		//执行SQL语句:insert into SCOTT.T_DEPT (P_NAME, P_ID) values (?, ?)
		//结果:"人事部" 插入;
		//dept.setPName("人事部");	
		/************************************************************************/
		
		this.getSession().save(dept);	//dept对象进入了save(),此时处于临时态和持久态之间
		
		/*****************************情况二*******************************************/
		//在两种状态之间进行数据的改变:
		//SQL语句:	insert into SCOTT.T_DEPT (P_NAME, P_ID) values (?, ?)
		//			update SCOTT.T_DEPT set P_NAME=? where P_ID=?
		//该状态下数据对象的改变:先执行插入语句,紧接着发现内存中数据有变化,马上执行修改语句;
		//结果:"人妖部" 插入
		dept.setPName("人妖部");
		System.out.println("插入数据ID:"+dept.getPId());	//此时可以获取到新插入数据的ID ,Hibernate的人性化;
		/************************************************************************/
		
		/******************************情况三******************************************/
		// 如果是在commit(提交了之后,即完全持久态的时候修改数据是无效的,不执行任何的操作)
		/************************************************************************/
		
		this.commitTransaction();		//两种状态,commit之后永远持久,close之后则所有的数据对象变换为游离态
	}
	
	//动作:修改
	/*	状态的改变通过持久对象的配置文件TDept.hbn.xml文件来解决这个方法;
	 * <class name="com.svse.entity.TDept" table="T_DEPT" schema="SCOTT" select-before-update="true">
	 *	
	 *	select-before-update="" :该属性的值为:true/false;  解释:是否在修改前进行查询;
	 *	true:	如果插入的数据和查询的一致那么不执行修改语句,反之;
	 *
	 * */
	public void updateDept(TDept dept){
		this.beginTransaction();
		this.getSession().update(dept);
		this.commitTransaction();
	}
	
	
	//方法:saveOrUpdate();
	/*saveOrUpdate()
	 * 如果数据库中有对应的数据则修改,没有则进行增加
	 * */
	public void saOrUpp(TDept dept){
		this.beginTransaction();
		this.getSession().saveOrUpdate(dept);
		this.commitTransaction();
	}
	
	
	//查询:load(); get();
	public TDept getOne(int p_id){
		TDept dept = (TDept) this.getSession().load(TDept.class, new Integer(p_id));
		TDept dept2 = (TDept) this.getSession().get(TDept.class, new Integer(p_id));
		
		/* 在关闭Session之前,可以获取使用load(); get();得到的值 */
	
		this.closeAll();
		
		/* 关闭之后:dept 为空,此时使用dept对象获取数据会抛出异常,而dept2则能获取到数据  */
		return dept;
	}
	
	
	//清楚缓存:evict();  clear();
	public void clear(int p_id){
		TDept dept = (TDept) this.getSession().get(TDept.class, new Integer(p_id));
		
		System.out.println("此时是否存在与Session:"+this.getSession().contains(dept));//true
		
		//执行清楚缓存的方法:evict();
		this.getSession().evict(dept);
		
		//一次性的清楚所有的数据对象,清除缓存
		this.getSession().clear();
		
		System.out.println("执行evict()之后:"+this.getSession().contains(dept)); //false;
		
		this.closeAll();
		
	}
	
	//测试程序入口
	public static void main(String[] args) {
		
		DeptDao_state dao = new DeptDao_state();
		
		//即将进入Session的数据对象
		TDept dept = new TDept();
		
		//设置需要增加的值
		dept.setPName("销售部");
		dept.setTEmps(null);//不用管
		dao.addDept_t1(dept);
		dao.clear(1);
	}
}




已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hibrernate 数据 对象] 推荐:

Hibrernate 数据对象状态

- - ITeye博客
Hibernate 中数据对象状态概念介绍. 一、 数据对象在Session中的状态:. 1、理解Session的缓存:Session接口是Hibernate向应用程序. 提供操作数据库的主要接口,它提供了基本的增、删、改、查 方法;. Session具有一个缓存,Hibernate的缓存包括Session的缓存和SessionFactory的缓存;.

MySQL优化之数据库结构:数据对象优化

- - CSDN博客数据库推荐文章
使用PROCEDURE ANALYSE函数优化表的数据类型. 表需要使用何种数据类型,是需要根据应用来判断的. 在MySQL中,可以使用函数PROCEDURE ANALYSE()对当前应用的表进行分析,该函数可以对数据库中列的数据类型提出优化建议,用户可以根据应用的实际情况斟酌考虑是否实施优化. 以下是函数PROCEDURE ANALYSE()的使用方法:.

使用DUL挖数据文件恢复非数据外对象方法

- - 惜分飞
在dul进行数据库挖掘恢复的时候,我们可以通过unload table/user等方式来恢复表数据,但是对于一些view,index,trigger,source,seq,Dblink等不能直接通过unload来实现,但是可以通过挖基表来实现相关操作,这里提供了一些处理思路,在实际操作中根据需求,分析数据字典灵活应用.

深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用

- - 编程语言 - ITeye博客
对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例;又可以说是判断对象实例是否物理相等;. 对比两个对象实例是否相等. 当对象所属的类没有重写根类Object的equals()方法时,equals()判断的是对象实例的ID(内存地址),是否是同一对象实例;该方法就是使用的等号(==)的判断结果.

数据库性能优化、统计信息与对象统计信息概述收集、扩展统计信息、dbms_stats.get_prefs

- - CSDN博客数据库推荐文章
      1.基于成本的Oracle优化法则.       2.Oracle性能诊断艺术.       3.基于Oracle的SQL优化.      基于cost 更大适应性/灵活性/10g开始.      基于规则 制定了15条/10g以前. 1.系统统计信息       . 2.数据库对象统计信息 .

数据库表为什么不可以只设置一个主键,一个text类型,序列化存储对象,这难道不跟nosql差不多了?

- - 知乎热榜
啊……这个……看着一群人见山不是山的一阵胡扯,不由得有些尴尬……. 首先,明确回答题主的问题:在你面对的工程问题面前,你的想法完全可行. 但是,这个世界上,是有很多完全不同的问题的……. 想说清楚这个,我就得从头开始科普了. 关系型数据库背后是所谓的“关系代数”. 这个东西意思嘛……大致来说是这样的:对于一组二维表格格式的数据,在上面可以做的基本操作只有四种,也就是并、交、差、笛卡尔积,其它运算都可以通过基本运算的组合得到.

javascript对象转json

- - JavaScript - Web前端 - ITeye博客
把javascript对象转成json. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

对象的消息模型

- loudly - 酷壳 - CoolShell.cn
[ ———— 感谢 Todd 同学 投递本文,原文链接 ———— ]. 话题从下面这段C++程序说起,你认为它可以顺利执行吗. 试试的确可以顺利运行输出hello world,奇怪吗. 其实并不奇怪,根据C++对象模型,类的非虚方法并不会存在于对象内存布局中,实际上编译器是把Hello方法转化成了类似这样的全局函数:.

jQuery的deferred对象详解

- 郑小东 - 阮一峰的网络日志
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax. 为了实现它,jQuery的全部ajax代码都被改写了.

我连对象都没有。。。

- 老五 - Lzhi&#39;s Views
两个黄鹂鸣翠柳,我连对象都没有. 劝君更尽一杯酒,我连对象都没有. 莫愁前路无知己,我连对象都没有. 借问酒家何处有,我连对象都没有. 停车坐爱枫林晚,我连对象都没有. 一枝红杏出墙来,我连对象都没有. 壮士一去不复还,我连对象都没有. 烈火焚烧浑不怕,我连对象都没有. 雌雄双兔奔地走,我连对象都没有.