在嵌入式h2中找不到数据

时间:2015-07-16 06:28:29

标签: hibernate h2

我在我的应用程序中使用spring4 hibernate4和h2作为嵌入式数据库,这是核心配置:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <!-- data srouce -->
    <context:component-scan base-package="cn.sw.repository"/>
    <bean id="bussiness_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${bussiness.jdbc.driverClassName}"/>
        <property name="url" value="${bussiness.jdbc.url}"/>
        <property name="username" value="${bussiness.jdbc.username}"/>
        <property name="password" value="${bussiness.jdbc.password}"/>
        <property name="accessToUnderlyingConnectionAllowed" value="true"/>
    </bean>

    <bean id="bussiness_entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="bussiness_dataSource">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">${bussiness.jpa.dialect}</prop>
                <prop key="hibernate.showsql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="packagesToScan" value="cn.sw.model"/>
    </bean>

    <tx:annotation-driven transaction-manager="bussiness_transactionManager"/>
    <bean id="bussiness_transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="bussiness_entityManagerFactory"/>
    </bean>
</beans>

属性占位符:

bussiness.jdbc.driverClassName=org.h2.Driver
bussiness.jdbc.url=jdbc:h2:file:D:/h2db/bus
bussiness.jdbc.username=sa
bussiness.jdbc.password=sa
bussiness.jpa.dialect=org.hibernate.dialect.H2Dialect

的Junit测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/application-config.xml"})
@Transactional
public class ServiceTest {
    @Autowired
    UserService userService;
    @Test
    //@Ignore
    public void create() {
        for (int i = 0; i < 10; i++) {
            User u = new User();
            u.setUsername("u-" + i);
            u.setPassword("p-" + i);
            userService.save(u);
        }
        SearchResult<User> s = userService.findByCondition(new HashMap<String, Object>());
        assertEquals(10, s.getList().size());
    }


//    @Test
    public void query() {
        SearchResult<User> s = userService.findByCondition(new HashMap<String, Object>());
        assertEquals(10, s.getList().size());
    }
}

当我运行测试create时,它是成功的,我可以在D:/h2db/bus找到该文件,并且一旦我运行测试,文件大小将相应增加。

然后我删除数据库文件,运行create一次,然后忽略create

现在表中应该有10条记录,但是当我尝试连接数据库时,我找不到像t_user这样的表格。

然后仅运行query测试,

失败

expected:<10> but was:<0>

发生了什么事?

1 个答案:

答案 0 :(得分:1)

测试中的@Transactional注释与普通代码的工作方式不同。

在退出带注释的方法时,它会进行回滚,以避免对其他测试产生副作用:

  

框架将为每个测试创建并回滚事务

来自http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testing-tx

如果您需要(来自同一来源),您似乎可以更改此行为:

  

如果您希望事务提交 - 异常,但偶尔需要特定测试来填充或修改数据库 - 可以指示TestContext框架使事务提交而不是通过@TransactionConfiguration回滚并且@Rollback注释。

     

使用TestContext framework查看交易管理。