2016-08-10 39 views
1

在Java中的Hibernate,當我們需要做一些與DB,我們需要: 1.打開會議 2.開始交易 3.完成交易 4.關閉會話會話和交易在Hibernate中的Java

  • 例如,如果我想獲得學生名單:

    public static List<Student> getStudentList() 
    { 
        List<Student> l = null; 
        Session session = HibernateUtil.getSessionFactory().openSession(); 
        try { 
         String hql = "from Student"; 
         Query query = session.createQuery(hql); 
         l = query.list(); 
        } catch (HibernateException ex) { 
         //Log the exception 
         System.err.println(ex); 
        } finally { 
         session.close(); 
        } 
        return l; 
    } 
    
  • 插入一個學生

    public static boolean addStudent(Student s) 
    { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    
    if (... /* check if student is already exists*/) 
    { 
        return false; 
    } 
    Transaction transaction = null; 
    
    try { 
        transaction = session.beginTransaction(); 
        session.save(s); 
        transaction.commit(); 
    } catch (HibernateException ex) { 
        //Log the exception 
        transaction.rollback(); 
        System.err.println(ex); 
        } finally { 
         session.close(); 
    } 
    return true; 
    } 
    

爲什麼getStudentList()中沒有事務?在此先感謝

回答

1

此休眠article解釋了未在事務中顯式執行的SELECT操作的行爲。

以下示例在文章中給出,但對於您的查詢示例也是如此。

Session session = sessionFactory.openSession();
session.get(Item.class,123l);
session.close();

  1. 新會話打開。它在這一點上不會獲得數據庫連接。
  2. 對get()的調用觸發SQL SELECT。會話現在從連接池中獲得一個JDBC連接。 Hibernate默認情況下立即使用setAutoCommit(false)關閉此連接上的自動提交模式。這有效地啓動了一個JDBC事務!
  3. SELECT在此JDBC事務中執行。會話關閉,連接返回到池並由Hibernate釋放 - Hibernate在JDBC Connection上調用close()。未提交的交易會發生什麼?

該問題的答案是「It depends!」當連接調用close()時,JDBC規範沒有提及有關未決事務的任何內容。發生什麼取決於供應商如何實施規範。例如,對於Oracle JDBC驅動程序,調用close()提交事務!大多數其他JDBC供應商採用相同的路由,並在關閉JDBC連接對象並將資源返回到池時回退任何掛起的事務。 顯然,這不會是一個問題的選擇[...]

讓我們擴展上面的例子來挑起一個可能的問題。

Session session = sessionFactory.openSession(); 
Item item = session.get(Item.class, 123l); 
item.setPrice(10); 
session.close(); 

現在這取決於JDBC驅動程序,如果爲Item新的價格持續與否。

因此,只要沒有數據庫更改,即使您的JDBC驅動程序將回滾事務,您也可以忽略純粹的SELECT操作的開始和提交事務。

但無論如何,我會強烈建議在任何操作上使用交易以避免誤解和問題。