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(); 该方法是用与清楚缓存的,清楚一个;
代码如下:
class="java" name="code">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