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