hibernate架構學習筆記6:事務,hibernate學習筆記

來源:互聯網
上載者:User

hibernate架構學習筆記6:事務,hibernate學習筆記

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;//測試getCurrentSessionpublic 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,不要手動關閉,否則會有異常

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.