2011-03-05 57 views
1

我對JDBC連接,事務及其在EJB,JTA,Hibernate環境中的集成有點困惑。我的疑惑是:在EJB-Hibernate環境中使用JDBC env

  1. 當我們使用@Resource DataSource ds; ... ds.getConnection(),我們是否在託管bean使用的相同事務中工作?我們應該關閉連接,語句,結果集嗎?

  2. session.doWork怎麼樣?我們是否在同一筆交易中?關於結語和結果集呢?

  3. Hibernate中積極的發佈模式意味着連接在每個語句之後關閉。這是否意味着交易也被執行? (我不認爲這是真的,但我不明白Hibernate如何在這裏工作)

回答

0

有幾件事你需要弄清楚。首先你需要確定你的工作單位是什麼。 Session-per-request模式是最常用的模式之一,除非您有特定的需求堅持。 如果您使用Hibernate,則不要直接使用語句和結果集。 Hibernate會爲你做到這一點。你需要關閉的是休眠會話

你使用的是一個SessionFactory和一個Session對象。這個環節幾乎代表了你的工作單元。在hibernate會話中,您可以獲取對象,然後將其更改並保存回去。 每個請求模式的會話在接收到請求時打開一個會話,並在回覆響應時關閉該會話。

在一個容器管理的EJB會話bean中,一個事務可用,您(或hibernate)在這樣的容器中使用的數據源由JTA TransactionManager自動處理。

現在因爲Hibernate很聰明,它可以自動將「當前」會話綁定到當前的JTA事務。 這使得易於實施的session-per-要求戰略與SessionFactory的使用getCurrentSession()方法:

try { 
    UserTransaction tx = (UserTransaction)new InitialContext() 
          .lookup("java:comp/UserTransaction"); 

    tx.begin(); 

    // Do some work 
    factory.getCurrentSession().load(...); 
    factory.getCurrentSession().persist(...); 

    tx.commit(); 
} 
catch (RuntimeException e) { 
    tx.rollback(); 
    throw e; // or display error message 
} 

因此,要回答你的問題:

如果您使用的是一臺帶有JTA休眠容器,你最好使用JPA EntityManager或春季休眠模板。

這裏有一些參考: http://community.jboss.org/wiki/sessionsandtransactions#Transaction_demarcation_with_JTA http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html

+0

我使用Hibernate throught JPA和EntityManager,使用CMT(容器管理事務)。所以我不開始手動提交事務,將作業留給容器。因此,您正在回答第一個問題:我從ds.getConnection獲得的連接由容器管理,並且與我的實體管理器處於同一事務中。但其他兩個問題呢? doWork中的 – agori 2011-03-05 18:15:43

+0

連接由hibernate會話管理。所以是的,你仍然在同一屆會議上,只要你沒有明確地打開一個新的,你仍然會。 – mericano1 2011-03-07 10:25:43

+0

我認爲使用JTA時,AFTER_STATEMENT或積極模式是默認的發佈模式。 在這種情況下,hibernate不會提交你的事務,它會改爲你的JTA TransactionManager – mericano1 2011-03-07 10:38:12

相關問題