我在我的应用程序中使用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>
发生了什么事?
答案 0 :(得分:1)
测试中的@Transactional
注释与普通代码的工作方式不同。
在退出带注释的方法时,它会进行回滚,以避免对其他测试产生副作用:
框架将为每个测试创建并回滚事务
来自http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testing-tx
如果您需要(来自同一来源),您似乎可以更改此行为:
如果您希望事务提交 - 异常,但偶尔需要特定测试来填充或修改数据库 - 可以指示TestContext框架使事务提交而不是通过@TransactionConfiguration回滚并且@Rollback注释。
使用TestContext framework查看交易管理。