2011-12-20 67 views
1

我們使用MyBatis(3.0.5)作爲我們的or-mapping工具(我沒有任何說法 - 所以!)。回滾ORMapper查詢

我創建了一個Response對象,它通過MyBatis映射到我們的[responses]數據庫表(我們使用PostgreSQL)。

事實上,我們使用ormapping結構如下:

  • ResponseMapper.xml - 這哪裏是PSQL查詢定義並映射到ResponseMapper.java **類及其XML文件方法
  • ReponseMapper.java - 用於一個接口 - 用於執行
  • XML文件(上文)中所定義的查詢ResponseDAO.java使用MyBatis的一種接口DI的目的(我們使用彈簧)
  • ResponseDAOImpl.java - ResponseDAO的具體實現,實際上調用ResponseMapper方法;我們使用Spring來注入此類的實例爲我們的應用程序

因此,插入一個新的[responses]記錄於PostgreSQL,代碼看起來像這樣從調用組件:

@Autowired 
private ResponseDAO response; 

public void doStuff() 
{ 
    int action = getAction(); 

    response.setAction(action); 

    response.insert(); 
} 

此設立工程爲我們精美。不過,我現在正在嘗試爲ResponseDAOImpl類編寫一組JUnit測試,並且我想確保它正確地對我們的PostgreSQL數據庫執行查詢。

據我所知,沒有辦法「模擬」整個數據庫。所以我唯一的選擇(貌似)是讓測試方法執行一個查詢,檢查成功,然後無論如何回滾。

MyBatis似乎不支持這種回滾功能。我發現this在Old Nabble的郵件列表中發佈了mybatis-user郵件列表,但海報使用的是Guice,他/她的問題似乎更多的是通過Guice回滾交易。

如果MyBatis的支持交易/回滾(不是嗎?!?!),然後好像我唯一repireve是,如果PostgreSQL相關的JDBC驅動程序支持這些。我想我可以嘗試配置我的測試方法,以便它們運行ResponseDAO.insert()方法,然後手動嘗試通過驅動程序直接回滾事務(無MyBatis)。

是否對此有任何經驗?代碼示例?提示?最佳實踐?提前致謝!

回答

0

MyBatis允許在使用「SqlSession」進行回滾時,事情是使用spring依賴注入塊,當方法完成時它會自動提交事務。

您有幾種選擇,他們之間

  1. 注入你的依賴關係的模擬。有一些搖擺的圖書館來幫助這一點。像Mockito,here is a good question on Spring Mockito stuff。這將測試你的業務邏輯在你的Java中,但不是你的實際查詢。

  2. 提交您的查詢,並在測試運行後刪除您的數據。這是我們採取的方法,因爲它也測試我們的數據庫。你顯然需要一個你的數據庫的測試實例,這是一些人沒有的。

  3. 您可以嘗試爲MyBatis Spring Integration中自動提交的類提供您自己的測試綁定,並覆蓋那裏的行爲,以便在測試環境中的行爲是回滾查詢而不是提交。在Guice集成中使用了類似的方法,並且其被描述爲here

+0

安迪,你可以看看雷米斯B的回答,以及我的後續評論嗎?該解決方案不起作用?如果我的測試方法首先從SqlSessionFactoryBean中獲取SqlSession,並且setAutoCommit(false),獲得一個Savepoint,執行查詢,然後回滾到Savepoint? Spring仍然會覆蓋這種行爲嗎?!? – IAmYourFaja 2011-12-20 21:08:48

+0

你注射圖譜嗎?如果是這樣,我認爲Spring仍然會爲mapper調用打開一個新的SqlSession。我對Guice的東西非常熟悉,但是文檔[1]讓我認爲映射器運行自己的sql會話。 http://code.google.com/p/mybatis/downloads/detail?name=mybatis-spring-1.0.2-reference.pdf – Andy 2011-12-20 21:23:02

0

不確定這是你需要的,但org.apache.ibatis.session.SqlSession類有rollback()方法可用於回滾。

另一種方法是從同一個類中使用getConnection()方法,該方法將返回也具有commit()和rollback()方法的javax.sql.Connection javax.sql.Connection類。

希望它有幫助。 Remis B

+0

你知道嗎,我什至沒有想到這一點。我可以通過我的應用程序上下文(由Spring提供)訪問SqlSessionFactory。從那裏我可以得到SqlSession和連接,就像你指出的那樣,我可以訪問Savepoints,commit()和rollback()。感謝Remis! – IAmYourFaja 2011-12-20 21:07:53

+0

不客氣。這應該工作。 – 2011-12-20 21:30:13