hibernate的事務管理和session對象的詳解


		//開啟事務
		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 創建失敗");
		}
	}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM