Hibernate 管理 Session

Hibernate 管理 Session_第1张图片


Hibernate 管理 Session_第2张图片


Hibernate 管理 Session_第3张图片

Hibernate 管理 Session_第4张图片

Hibernate 管理 Session_第5张图片

Hibernate 管理 Session_第6张图片


Hibernate 管理 Session_第7张图片

Hibernate 管理 Session_第8张图片



~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 管理Session 

一. Hibernate 自身提供了 3种管理Session 对象的方法

                               ①. Session 对象的生命周期与本地线程绑定

                               ②. Session 对象的生命周期与JTA 事务绑定

                               ③. Hibernate 委托程序管理Session 对象的生命周期

二. 在 Hibernate 的配置文件中 hibernate.current_session_context_class 属性用于       指定Session 管理方式,可选值包括3种

                               ①.thread:      Session 对象的生命周期与本地线程绑定

                               ②. jta*:          Session 对象的生命周期与JTA 事务绑定

                               ③. managed: Hibernate 委托程序管理Session 对象的生命周期

                           

推荐第一种

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

下面以第一种为例配置Hibernate 如何session 的管理步骤:

               ①. 在Hibernate 的配置文件hibernate.cfg.xml 中配置 hibernate.current_session_context_class

    
     	thread
          ②. 创建管理session 的类HibernateUtils.java

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

public  class HibernateUtils {
	
	//hIbernate的构造器
	public HibernateUtils(){}
	
	//获取Hibernte的单实例
	private static HibernateUtils instance =  new HibernateUtils();
	public static HibernateUtils getInstance(){
		return instance;
	}
	
	//获取sessionFactory
	private SessionFactory sessionFactory;
	public SessionFactory getSessionFaction(){
		if(sessionFactory == null){
			Configuration configuration = new Configuration().configure();
			
			ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
											.applySettings(configuration.getProperties())
											.buildServiceRegistry();
			sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		}
		return sessionFactory;
	}
	
	// 通过getCurrentSession() 可以把 session和 当前线程绑定  :Current 的意思是:当前的
	public Session getSession(){
		return getSessionFaction().getCurrentSession();
	}
}

Hibernate 管理 Session_第9张图片

	@Test
	public void testHibernateManageSession(){
		//获取session
		//开启事务
		Session session = HibernateUtils.getInstance().getSession();
		System.out.println("-->" + session.hashCode());
		Transaction transaction = session.beginTransaction();
		
		DepartmentDAO departmentDAO = new DepartmentDAO();
		
		Department dept = new Department();
		
		dept.setName("ChuckHero");
		
		departmentDAO.save(dept);
		departmentDAO.save(dept);
		departmentDAO.save(dept);
	
		//若 Session 是由 thread 来管理的,则 在提交或回滚事务后,就 已经关闭Session
		System.out.println( "session.isOpen()1: " + session.isOpen());
		transaction.commit();
		System.out.println( "session.isOpen()2: " + session.isOpen());
	}


观察它们的hashCode 的值和提交事务前后session.isOpen的值:

-->852989707
session.hashCode: 852989707
Hibernate: 
    select
        user_deptid.nextval 
    from
        dual
session.hashCode: 852989707
session.hashCode: 852989707
session.isOpen()1: true
Hibernate: 
    insert 
    into
        BB_DEPARTMENTS
        (NAME, ID) 
    values
        (?, ?)
session.isOpen()2: false

批量操作数据


批量操作数据 时,通过 JDBC 原生的 API 进行操作, 效率最高, 速度最快!

//方法如下获取Connection

	@Test
	public void testHibernateBath(){
		session.doWork(new Work() {			
			@Override
			public void execute(Connection connection) throws SQLException {
				//通过 JDBC 原生的 API 进行操作, 效率最高, 速度最快!
			}
		});
	}




你可能感兴趣的:(Hibernate)