`
1140566087
  • 浏览: 547700 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18076
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:309479
Group-logo
J2ME 基础学习课程集
浏览量:17993
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17195
社区版块
存档分类
最新评论

Hibrernate 数据对象状态

阅读更多

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);
	}
}


  • 大小: 34.2 KB
0
1
分享到:
评论

相关推荐

    spring快速入门教程

    本书学习用struts MVC框架作前端,Spring做中间层,Hibrernate作后端来开发Spring应用程序。

    电信塔施工方案.doc

    5G通信行业、网络优化、通信工程建设资料。

    29-【智慧城市与政府治理分会场】10亿大数据助推都市治理-30页.pdf

    29-【智慧城市与政府治理分会场】10亿大数据助推都市治理-30页.pdf

    ABB IRC5 Compact 机器人产品手册

    ABB IRC5 Compact 机器人产品手册

    LTE容量优化高负荷小区优化指导书.docx

    5G通信行业、网络优化、通信工程建设资料

    施工工艺及质量检查记录表.docx

    5G通信行业、网络优化、通信工程建设资料。

    25G无源波分安装规范指导.docx

    5G通信、网络优化与通信建设

    基于Springboot+Vue在线宠物用品交易网站毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    通信各专业(管道、线路、设备)安全操作规程.docx

    5G通信行业、网络优化、通信工程建设资料

    node-v12.13.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    C#Gif动画录制软件是一款方便好用的小软件源码.zip

    Gif动画录制软件是一款方便好用的小软件,使用此工具,您可以记录屏幕的选定区域,网络摄像头的实时提要或草图板上的实时图形。之后,您可以编辑动画并将其另存为gif,apng,视频,psd或png图像。

    协同供应链集成详细功能介绍V70.rar

    协同供应链集成(Collaborative Supply Chain Integration,CSCD是数字化转型解决方案中的重要一环,旨在通过技术手段实现供应链各环节的无缝对接与高效协作。V70版本作为该解决方案的一个升级版,可能包含了更加先进的功能和工具,以支持企业在复杂的商业环境中保持竞争力。这个资料包“协同供应链集成详细功能介绍V70.rar”很可能提供了对V70版本功能的深入剖析,包括了如何利用最新的数字化工具和技术来优化库存管理、订单处理、物流跟踪、供应商管理以及客户关系管理等关键供应链过程。它可能详细介绍了实时数据共享、自动化流程、预测分析、风险管理和智能决策支持系统等创新功能,这些功能有助于减少供应链中断,提高透明度,降低运营成本,并增强整个供应链网络的响应能力。通过这个资料,企业可以获得实施协同供应链集成的全面指导,了解如何通过集成的信息系统和平台,实现数据的一致性和准确性,以及如何通过合作伙伴之间的紧密协作,提升整个供应链的效率和灵活性。这对于追求数字化转型的企业来说,是一个宝贵的资源,因为它不仅提供了理论框架,还可能包含了实际案例研究、最佳实践和实施策略,帮助企业

    英飞凌官方ADS库1.9.20版

    英飞凌官方ADS库1.9.20版

    node-v7.7.3.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v11.1.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    通信工程质量控制方案.docx

    5G通信行业、网络优化、通信工程建设资料。

    5GC参数设置问题导致UE无法接入.docx

    5G通信行业、网络优化、通信工程建设资料

    动力机房--低压市电、基础勘察设计知识.pptx

    5G通信行业、网络优化、通信工程建设资料

    jump(1).mobileprovision

    jump(1).mobileprovision

    node-v6.14.3-aix-ppc64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics