hibernate的事務管理和session物件的詳解

lonecloud發表於2016-07-28
		//開啟事務
		transaction=session.beginTransaction();

 上面為開啟事務

transaction.commit();這個為提交事務

從session物件中獲取事務後進行提交

 

 

下面可以自動提交事務,並且可以不需要對於這個事務進行提交,但是不推薦這樣進行使用這個方法

		session.doWork(new Work() {
			//這裡的connection物件就是jdbc中的物件
			@Override
			public void execute(Connection connection) throws SQLException {
				// TODO Auto-generated method stub
				connection.setAutoCommit(true);//設定自動提交事務
			}
		});

 在設定自動提交事務後必須對session進行重新整理操作後才能有效

	session.flush();//對於事務設成自動提交後需要對session進行重新整理後才能使用

 openSession 每次使用都是開啟一個新的session,使用完需要呼叫close方法關閉session;如果不關閉會導致每次都開啟一個connection物件,最後導致連線池溢位

 


getCurrentSession 是獲取當前session物件,連續使用多次時,得到的session都是同一個物件,這就是與openSession的區別之一 ;
一般在實際開發中,往往使用getCurrentSession多,因為一般是處理同一個事務,所以在一般情況下比較少使用openSession;
如何獲得session物件???
(1)openSessionion
(2)getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml檔案中進行配置:
如果是本地事務(jdbc事務)
<property name="hibernate.current_session_context_class">thread</property>
如果是全域性事務(jta事務)
<property name="hibernate.current_session_context_class">jta</property>

package cn.lonecloud.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 configuration = new Configuration().configure();// 獲得配置檔案物件
		ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
				.buildServiceRegistry();//獲得服務註冊物件
		SessionFactory factory=configuration.buildSessionFactory(registry);//獲得session工廠物件
		Session session=factory.openSession();//獲取session物件
		if (session!=null) {
			System.out.println("Session 建立成功");
		}else {
			System.out.println("Session 建立失敗");
		}

	}
	//在使用getCurrentSession的時候必須在cfg配置檔案中進行配置
	// 		<!--設定當前的session物件的型別thead為當前的jdbc的session物件 -->
//	<!-- 如果是本地事務(jdbc事務) -->
//	<property name="hibernate.current_session_context_class">thread</property>
//<!-- 		如果是全域性事務(jta事務)
//	<property name="hibernate.current_session_context_class">jta</property> -->
	@Test
	public void TestCurrentSession(){
		Configuration configuration = new Configuration().configure();// 獲得配置檔案物件
		ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
				.buildServiceRegistry();//獲得服務註冊物件
		SessionFactory factory=configuration.buildSessionFactory(registry);//獲得session工廠物件
		Session session=factory.getCurrentSession();//獲取session物件
		if (session!=null) {
			System.out.println("Session 建立成功");
		}else {
			System.out.println("Session 建立失敗");
		}
	}
}

 

相關文章