首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

AbstractTransactionalDataSourceSpringContextTests=鸡肋

2012-11-05 
AbstractTransactionalDataSourceSpringContextTests鸡肋?我用mysql做数据库,使用AbstractTransactionalD

AbstractTransactionalDataSourceSpringContextTests=鸡肋?
我用mysql做数据库,使用AbstractTransactionalDataSourceSpringContextTests测试时,发现根本没有写数据库,连错误都没有发生,直到我提交了事务才写数据库,并发现了错误。

springside的高人也说过:hibernate太奸诈了,如果全部默认回滚,只会在session里干活,一点不写数据库,达不到完全的测试效果。
http://www.springside.org.cn/docs/reference/UnitTest.htm

如果是这样的话,是否可以认为,AbstractTransactionalDataSourceSpringContextTests对hibernate来说,是个完全的鸡肋?因为不提交的话,事务完全回滚,根本不写数据库,连错误都找不出;提交的话,又破坏了数据。

如果不是鸡肋,那该如何改进?public abstract class AbstractDaoTestCase extends AbstractTransactionalDataSourceSpringContextTests {/** * 不同的应用程序必须指定不同的key值,也就是说不同的应用程序必须覆盖此方法 */@Overrideprotected Object contextKey() {return Constants.FAMEWORK_CONTAINER_KEY;}@Overrideprotected ConfigurableApplicationContext loadContext(Object key) throws Exception {setAutowireMode(AUTOWIRE_BY_NAME);setDefaultRollback(false);return (ConfigurableApplicationContext) ContainerFactory.newInstance((String) key, getResources());} /** * get resources * 可以被子类覆盖 * @return String[] */protected String[] getResources() {return new String[] {"classpath:framework/framework-persistence-hibernate.xml","classpath:biz/biz-bookstore.xml" };}}
然后再继承这个抽象类,代码如下:

public class CustomerDAOTest extends AbstractDaoTestCase {private CustomerDAO customerDAO;public void testCRUD() {Customer customer = new Customer();//customer.setId(1);customer.setLoginid("netfly");customer.setName("netfly");customer.setPasswd("1234");customer.setEmail("oo@oo.com");customer.setAddress("shanghai");customer.setStatus("1");//保存对象,这里总会把数据插入数据库customerDAO.save(customer);//// 保证id生成assertNotNull(customer.getId());//////重新获得对象customer = customerDAO.get(customer.getId());//保证能获取刚才保存的对象assertNotNull(customer);// 保证获取对象的属性值与保存时相同assertEquals("oo@oo.com", customer.getEmail());//// 删除对象//customerDAO.remove(customer);//try {//customerDAO.get(customer.getId());//fail("Entity found in database after deleted");//} catch (Exception e) {//assertNotNull(e.getMessage());//}                  //这里回滚没有任何效果//transactionManager.rollback(transactionStatus);}/** * @param customerDAO the customerDAO to set */public void setCustomerDAO(CustomerDAO customerDAO) {this.customerDAO = customerDAO;}}
13 楼 Godlikeme 2006-12-26     protected ConfigurableApplicationContext loadContext(Object key) throws Exception {  
        setAutowireMode(AUTOWIRE_BY_NAME);  
       setDefaultRollback(false); 
        return (ConfigurableApplicationContext) ContainerFactory.newInstance((String) key, getResources());  
    }  
这个太明显了吧,还是setDefaultRollback(false)呢。
没有看到在任何地方做session的处理。 14 楼 netfly 2006-12-27   问题解决了,原来是我的数据库不支持事务,哈哈!谢谢大家的关注,springside误导了我,害人不浅呀。

MYSQL中只有INNODB和BDB类型的数据表才支持事务处理!其他的类型是不支持. 15 楼 littcai 2007-04-12   加一个拦截器,在方法结束后调用flush操作

热点排行