1. 程式人生 > >hibernate框架學習筆記6:事務

hibernate框架學習筆記6:事務

isolation -c blog 重復 .config rollback pre ont .com

MySQL的事務、JDBC事務操作:

詳細見這篇文章:比較詳細

http://www.cnblogs.com/xuyiqing/p/8430214.html

如何在hibernate中配置隔離級別:

再核心配置文件中:

         <!-- 指定hibernate操作數據庫時的隔離級別 
            #hibernate.connection.isolation 1|2|4|8        
            0001    1    讀未提交
            0010    2    讀已提交
            0100    4    可重復讀
            1000    8    串行化
         
--> <property name="hibernate.connection.isolation">4</property>

這裏是二進制,轉換成十進制就是1,2,4,8

項目中管理事務:

沒有學習hibernate框架以前,在項目中,開啟事務在業務層(service),執行之後提交或回滾

而在hibernate框架中,也是這樣,操作數據庫需要用到的session對象,一定保證,service層和dao層的session是同一個

類似servlet項目中需要確保service層和dao層的connection對象一致,當時用到了綁定線程

(這是以前sevlet項目中的一個工具類,可以瀏覽下對比)

技術分享圖片
package utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {

    private static DataSource dataSource = new
ComboPooledDataSource(); private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); // 直接可以獲取一個連接池 public static DataSource getDataSource() { return dataSource; } // 獲取連接對象 public static Connection getConnection() throws SQLException { Connection con = tl.get(); if (con == null) { con = dataSource.getConnection(); tl.set(con); } return con; } // 開啟事務 public static void startTransaction() throws SQLException { Connection con = getConnection(); if (con != null) { con.setAutoCommit(false); } } // 事務回滾 public static void rollback() throws SQLException { Connection con = getConnection(); if (con != null) { con.rollback(); } } // 提交並且 關閉資源及從ThreadLocall中釋放 public static void commitAndRelease() throws SQLException { Connection con = getConnection(); if (con != null) { con.commit(); // 事務提交 con.close();// 關閉資源 tl.remove();// 從線程綁定中移除 } } // 關閉資源方法 public static void closeConnection() throws SQLException { Connection con = getConnection(); if (con != null) { con.close(); } } public static void closeStatement(Statement st) throws SQLException { if (st != null) { st.close(); } } public static void closeResultSet(ResultSet rs) throws SQLException { if (rs != null) { rs.close(); } } }
View Code

在hibernate框架中,原理是一樣的,綁定線程

但是,只需要在核心配置文件中配置:

         <!-- 指定session與當前線程綁定 -->
         <property name="hibernate.current_session_context_class">thread</property>

代碼只需一行:

                SessionFactory sf = new Configuration().configure().buildSessionFactory();
                sf.getCurrentSession();

簡單的測試即可理解:

package demo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import utils.HibernateUtils;

//測試getCurrentSession
public class Demo {

    @Test
    //返回同一個與線程綁定的session
    public void fun1(){
        Session session1 = HibernateUtils.getCurrentSession();
        Session session2 = HibernateUtils.getCurrentSession();
        
        System.out.println(session1==session2);//true
    }
    
    @Test
    //返回不同的session
    public void fun2(){
        Session session1 = HibernateUtils.openSession();
        Session session2 = HibernateUtils.openSession();
        
        System.out.println(session1==session2);//false
    }
    
    
}

補上工具類:

技術分享圖片
package utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static SessionFactory sf;
    
    static{
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
         sf = conf.buildSessionFactory();
    }
    
    //獲得session => 獲得全新session
    public static Session openSession(){
                //3 獲得session
                Session session = sf.openSession();
                
                return session;
        
    }
    //獲得session => 獲得與線程綁定的session
    public static Session getCurrentSession(){
        //3 獲得session
        Session session = sf.getCurrentSession();
        
        return session;
    }    
}
View Code

註意:

通過getCurrentSession方法獲得的session對象,事務提交時候,會自動關閉session,不要手動關閉,否則會有異常

hibernate框架學習筆記6:事務