当前位置: 移动技术网 > IT编程>开发语言>Java > Hibernate三种状态和Session常用的方法

Hibernate三种状态和Session常用的方法

2019年07月22日  | 移动技术网IT编程  | 我要评论

aijia,搞怪碰碰球小游戏,课堂教学模式

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

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

session中常用的方法是save(),update(),saveorupdate(),get(),load(),delete(),clear(),flush()这些

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

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

这里我们首先建立一个实体类,studententity.java 和数据库中student所对应

package com.cwnu.entities; 
import javax.persistence.*; 
import java.io.serializable; 
/** 
 * created by yangy on 2015/12/19. 
 */ 
@table(name = "student") 
@entity 
public class studententity implements serializable{ 
 private int id; 
 private string name; 
 @id 
 @column(name = "id") 
 @generatedvalue(strategy = generationtype.auto) 
 private int getid() { 
  return id; 
 } 
 public void setid(int id) { 
  this.id = id; 
 } 
 @column(name = "name") 
 public string getname() { 
  return name; 
 } 
 public void setname(string name) { 
  this.name = name; 
 } 
} 

junit类都是idea编译环境给我们配置好了,这里我们要注意,要使用getcurrentsession()来操作的话,我们首先要在junit类中加上@transaction注解,下面是相关的测试方法:

 @test 
public void testgetorload() { 
 session session = sessionfactory.getcurrentsession(); 
 studententity student = (studententity)session.get(studententity.class, 1); 
 //studententity student_load = (studententity)session.load(studententity.class,1); string name = student.getname(); 
} 

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

所以我们看出get()和load()之间的差别:

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

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

@test 
 public void testclear() { 
  session session = sessionfactory.getcurrentsession(); 
  session.get(studententity.class,1); 
  session.clear(); 
  session.get(studententity.class,1); 
 } 

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

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

session session = sessionfactory.opensession(); 
transaction tx = session.begintransaction();  
for ( int i=0; i<100000; i++ ) {  
customer customer = new customer(.....);  
session.save(customer);  
if ( i % 20 == 0 ) { 
//20, same as the jdbc batch size   
//flush a batch of inserts and release memory:   
session.flush();  
session.clear();  
}}  
tx.commit();session.close(); 

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网