Hibernate—session与transaction

session可以理解为操作数据库的对象。

transaction:hibernate对数据的操作都是封装在事务中,默认为非自动提交。所以使用seesion,先把session封装在事务中,然后提交事务。

也可使用session的dowork()方法,并设置提交事务模式。来变成自动提交jdbc的模式。

junit测试用例:

package Test;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import Ab.Student;

public class StudentTest {
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	
	@Before
	public void init(){
		//创建配置对象
		Configuration config=new Configuration().configure();
		//创建服务注册对象
		ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
		//创建会话工厂
		sessionFactory=config.buildSessionFactory(serviceRegistry);
		//会话对象
		session=sessionFactory.openSession();
		//开启事务
		//transaction=session.beginTransaction();
		
	}
	@After
	public void destory(){
		//提交事务
		//transaction.commit();
		//关闭会话
		session.close();
		//关闭工厂
		sessionFactory.close();
		
	}
	
     @Test
	public void testSaveStudent(){
    	 //生成学生对象
    	 Student s=new Student(3,"王大","男",new Date(),"杭州");
    	//dowork方法
    	 session.doWork(new Work() {
			
			@Override
			public void execute(Connection connection) throws SQLException {
				// TODO Auto-generated method stub
				//设置为自动提交事务模式
				connection.setAutoCommit(true);
				
			}
		});
    	 session.save(s);//保存对象  	 
    	 session.flush();//强制输出sql语句
    	 
    }
}
红色的部分是dowork方法的代码,最后加一个flush()来强制输出sql语句,不然无法完成。

那么如何获取session对象:

1、opensession()

2、getCurrentSession()

使用junit4来创建一个例子:

package Test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class SessionTest {

	@Test
	public void testOpenSession(){
		//创建配置对象
				Configuration config=new Configuration().configure();
				//创建服务注册对象
				ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
				//创建会话工厂
				 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
				//会话对象
				Session session=sessionFactory.openSession();
				if(session==null){
					System.out.println("OpenSession创建失败");
				}else{
					System.out.println("OpenSession创建成功");
				}
				
	}
	@Test
//使用getCurrentSession()时需要注意在cfg.xml文件中加上<property name="hibernate.current_session_context_class">thread</property>jdbc本地事务
 public void testGetCurrentSession(){
		Configuration config=new Configuration().configure();
		//创建服务注册对象
		ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
		//创建会话工厂
		 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
		//会话对象
		Session session=sessionFactory.getCurrentSession();
		if(session==null){
			System.out.println("getCurrentSession()创建失败");
		}else{
			System.out.println("getCurrentSession()创建成功");
		}
	}
}
getCurrentSession和openSession的区别:

1、getCurrentSession()在事务提交或回滚之后,可以自动关闭,而opensession需要手动关闭。若没有及时关闭,会导致连接池的溢出,资源枯竭

2、opensession每次都创建新的session对象,而getCurrentSession使用现有的session对象。getCurrentSession是一种单例模式。

猜你喜欢

转载自blog.csdn.net/wkztselina/article/details/53446670