2011-06-28 58 views
0

我想創建一個測試用例爲使用原生的Hibernate API(無彈簧的東西一樣的HibernateTemplate,HibernateDaoSupport的)我的DAO類,就像這樣:春/休眠/ TestNG的 - 手動會話和交易建立

sessionFactory.getCurrentSession().save(obj); 

我在春季文檔中顯示了適當的sessionFactory和transactionManager定義,如春季文檔中所示。

我想要的是在我的啓動代碼中打開一個事務並在最後回滾。

因此,這與每個測試方法調用的默認Spring單元測試支持事務概念不同,因此我無法擴展AbstractTransactionalTestNGSpringContextTests。

我需要一種方式來啓動一個事務,並以某種方式在會話工廠中提供它。我覺得這應該是非常容易的,但在閱讀和實驗之後無法實現。

任何幫助將不勝感激。

回答

1

如果您不想使用HibernateTemplate,您可以直接使用transactionManager,如10.6.2 Using the PlatformTransactionManager中所述。

+0

的測試方法是,這就是我想做的事,但我需要以某種方式對夫婦這休眠會話,這是我的難題。 – Max

+0

@ m17:如果您已經正確配置了'HibernateTransactionManager',它應該自動耦合,請參閱http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/orm.html# orm-hibernate-straight – axtavt

+0

10x很多,它以這種方式工作。 – Max

0
try { 
    Session session = factory.openSession(); 
    Transaction tx = session.beginTransaction(); 
    ... 
    tx.commit(); 
    session.close(); 
} catch (SomeException e) { 
    tx.rollback(); 
    ... 
} 
+0

其實我不能使用這個,因爲我的DAO在內部使用sessionFactory.getCurrentSession()。所以我需要一種方法來「保存」會話和關聯事務。 在生產環境中,我在服務層使用了spring聲明式事務,並且所有事情都對我透明。但在測試中,我需要手動處理這個「透明度」 – Max

+0

@ m17啊,我看,沒有通過我猜想你的問題。在我的DAO中,我通常創建getSession()和setSession()方法,以便我可以使用DAO IOC。所以在我的junit測試中,我創建了會話,有或沒有事務,並將其設置在DAO上。 –

0

@Transactional(唯讀=假,傳播= Propagation.REQUIRED)

註釋使用上述

+0

據我瞭解,這將把每個方法都包含在單獨的事務中。如果沒有拋出異常,它會提交這個事務。 – Max

+0

是的,您可以註釋方法並開始交易 –