AbstractTransactionalDataSourceSpringContextTests缺乏對hibernate session的處理,需要對其進行擴展,擴展基本思路是在事務開始后,結束前把測試方法包裝在
HibernateTemaplate.executeWithSession(...){
public Object doInHibernate(Session session) {
runTest();
session.flush();//synchornize database, errors will be reported.
session.clear();}...}
而AbstractTransactionalDataSourceSpringContextTests只要你不調用super.setDefaultRollback(false);這個基類默認就會回滾! 于是由此產生hibernate偷懶,無法發現數據庫操作,然后我們建議你在測試中顯示調用session.flush
或者參雜一些查詢調用(其實也是為了觸發session.flush)。
不過這里面也有些陷阱:如果你的測試還是會把數據寫入了數據庫的話,可能是由于你加載的spring配置文件里有多個事務管理器或session工廠,從而導致AbstractTransactionalDataSourceSpringContextTests沒有獲得正確的TransactionManager或SessionFactory,所以就沒能回滾不過這種錯誤也不太容易犯,因為AbstractTransactionalDataSourceSpringContextTests默認按類型組裝,如果她發現有多個TransactionManager類型的bean是要報錯的,此時你需要調用setAutowireMode(this.AUTOWIRE_BY_NAME);使其按名稱組裝。
另外值得注意的是,使用MYSQL時候表的類型選擇。例如
CREATE TABLE `myisam` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) default NULL,
`content` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
這時候應該把類型改為InnoDB。
MySQL存儲引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:· MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默認的存儲引擎,除非你配置 MySQL默認使用另外一個引擎。 ·MEMORY存儲引擎提供“內存中”表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作為一個單獨的表。就像MyISAM一樣, MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。 釋:MEMORY存儲引擎正式地被確定為HEAP引擎。· InnoDB和BDB存儲引擎提供事務安全表。BDB被包含在為支持它的操作系統發布的MySQL-Max二進制分發版里。InnoDB也默認被包括在所 有MySQL 5.1二進制分發版里,你可以按照喜好通過配置MySQL來允許或禁止任一引擎。·EXAMPLE存儲引擎是一個“存根”引擎,它不做什么。你可以用這個 引擎創建表,但沒有數據被存儲于其中或從其中檢索。
posted on 2007-05-15 10:06
周銳 閱讀(2285)
評論(0) 編輯 收藏 所屬分類:
Hibernate 、
Spring