有幾件事你需要弄清楚。首先你需要確定你的工作單位是什麼。 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
我使用Hibernate throught JPA和EntityManager,使用CMT(容器管理事務)。所以我不開始手動提交事務,將作業留給容器。因此,您正在回答第一個問題:我從ds.getConnection獲得的連接由容器管理,並且與我的實體管理器處於同一事務中。但其他兩個問題呢? doWork中的 – agori 2011-03-05 18:15:43
連接由hibernate會話管理。所以是的,你仍然在同一屆會議上,只要你沒有明確地打開一個新的,你仍然會。 – mericano1 2011-03-07 10:25:43
我認爲使用JTA時,AFTER_STATEMENT或積極模式是默認的發佈模式。 在這種情況下,hibernate不會提交你的事務,它會改爲你的JTA TransactionManager – mericano1 2011-03-07 10:38:12