Hibernate三种状态和会话常用的方法

  

我们知道里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就要理清楚对象在整个操作中的所属的状态(瞬态、持久性、分离)。就像马士兵老师在视频中所说的,我们并不必死抠这些字眼,我们通过自己编写测试类就可以他们之间不同的区别。

  

其实三种状态各自的不必总结那么多,只是一个重要的地方就是瞬态状态里面的对象是没有id的。

  

 Hibernate三种状态和会话常用的方法

  

会话中常用的方法是保存()、update (), saveOrUpdate(),(),负载()、删除(),(),冲洗()这些

  

其中大学期间我其实对获得和负载方法都不是太熟悉,死记硬背才在考试中答的题,现在想起完全没有这个必要。我们可以根据配置好hibernate的环境来进行junit测试。

  

首先我们进行得到()方法进行测试。

  

这里我们首先建立一个实体类,StudentEntity。Java和数据库中学生所对应

        包com.cwnu.entities;   进口javax.persistence。*;   进口java.io.Serializable;/* *   *由yangy>   @Test   公共空间testGetOrLoad () {   会议会话=sessionFactory.getCurrentSession ();   StudentEntity学生=(StudentEntity) session.get (StudentEntity。类,1);//StudentEntity student_load=(StudentEntity) session.load (StudentEntity.class, 1);字符串名称=student.getName ();   }      

先测试得到方法,我们发现一旦我们只是拿学生这个实体操作,让方法是会输出相关的sql查询语句的,而我们注释掉得到方法,换负载方法的话,负载方法执行拿学生这个实体的数据是没有输出相应的sql语句的。但是我们在对学生类进行操作的时候,这时才输出相关的语句。

  

所以我们看出

  

get()每次执行都会执行sql语句,不会延迟.load()方法只是会在我们对拿到的实体进行操作的时候才去执行查询,拿到相应的实体信息.load方法返回的是一个代理对象(马士兵老师视频)。无论是得到还是负载首先都会查一级缓存(会话)中有没有相应的对应值,如果没有,再去数据库进行查找。

  

clear()方法是对会话里面的缓存进行了清理,测试这个方法我们可以根据下面的Junit进行测试:

        @Test   公共空间testClear () {   会议会话=sessionFactory.getCurrentSession ();   session.get (StudentEntity.class, 1);   session.clear ();   session.get (StudentEntity.class, 1);   }      

如果我们把session.clear()注释掉的话,我们就可以看到只执行了一条sql语句

  

冲洗()方法是是对数据库同步的一条语句,执行完这个后立即刷新到数据库。粗浅的来看哈,其实里面还是有很多东西,比如FlushMode这个类,我们默认设置的是FlushMode.AUTO,这个一般不修改,只是为了以后的性能调优。其实我们在执行事务的时候,事务完成之后它会帮我们执行冲洗()方法。只是我们在进行大规模插入的时候,我们经常可以看到下面的操作:

        会议会话=sessionFactory.openSession ();   事务tx=session.beginTransaction ();   for (int i=0;i<100000;我+ +){   客户客户=新客户(.....);   session.save(客户);   如果(我% 20==0){//20日JDBC批处理大小一样//刷新一批插入和释放内存:   session.flush ();   session.clear ();   }}   tx.commit (); session.close ();之前      

<强>这样做的目的就是避免大量插入,造成会话里面内存溢出,所以我们定时清理一下就可以避免这个问题。

  

  

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!

Hibernate三种状态和会话常用的方法