Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Junit测试在事务后不回滚_Spring_Hibernate_Junit_Spring Transactions - Fatal编程技术网

Spring Junit测试在事务后不回滚

Spring Junit测试在事务后不回滚,spring,hibernate,junit,spring-transactions,Spring,Hibernate,Junit,Spring Transactions,我试图对一些持久性代码进行单元测试,但遇到了一个问题,即数据库挂起在前面的测试中创建的行。我也在使用Hibernate搜索,尽管我在这里分享的代码中没有反映这一点 我正在使用Spring3.1.x、Hibernate4.x和HSQLDB2.3.2 日志 代码 代码 公共类CoreTest扩展了TestCase{ @注入 受保护的SimpleManager simpleMgr; public void baseSetup(){ simpleMgr.flush(); simpleMgr.clear(

我试图对一些持久性代码进行单元测试,但遇到了一个问题,即数据库挂起在前面的测试中创建的行。我也在使用Hibernate搜索,尽管我在这里分享的代码中没有反映这一点

我正在使用Spring3.1.x、Hibernate4.x和HSQLDB2.3.2

日志

代码

代码

公共类CoreTest扩展了TestCase{
@注入
受保护的SimpleManager simpleMgr;
public void baseSetup(){
simpleMgr.flush();
simpleMgr.clear();
//在第一次测试之后,它包含所有创建的用户角色
List roles=simpleMgr.getAll(UserRole.class);
UserRole=新的UserRole(UserRole.role\u匿名);
simpleMgr.save(角色);
角色=新用户角色(UserRole.role\u USER);
simpleMgr.save(角色);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@上下文配置(位置={
“类路径:/spring/applicationContext.xml”
“classpath:/spring/applicationContext transaction.xml”})
公共类MyManagerTest扩展了CoreTest{
@以前
公共void方法设置(){
super.baseSetup();
角色=新用户角色(UserRole.role\u PROUSER);
simpleMgr.save(角色);
simpleMgr.save(userMgr.createUser(“marc”marc@gmail.com"));
simpleMgr.flush();
}
@试验
@交易的
公共void test1(){
...
}
@试验
@交易的
公共无效测试2(){
....
}
事务管理

    <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="mainDataSource"/>
    </bean>

    <bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        [...]
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
        <property name="hibernateProperties">
            <value>
                hibernate.connection.driver_class=${jdbc.driverClassName}
                hibernate.jdbc.batch_size=30
                hibernate.dialect=${hibernate.dialect}
                hibernate.connection.autoReconnect=true
                hibernate.connection.autoReconnectForPools=true
                hibernate.connection.autocommit=false
            </value>
        </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

[...]
hibernate.connection.driver_class=${jdbc.drivercassname}
hibernate.jdbc.batch_size=30
hibernate.dialogue=${hibernate.dialogue}
hibernate.connection.autoReconnect=true
hibernate.connection.autoReconnectForPools=true
hibernate.connection.autocommit=false

尝试在测试类上添加@Transactional注释。

尝试添加事务拦截器:

<beans xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    ...
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>


扩展AbstractTransactionalJunit4SpringContextTests或添加@TestExecutionListeners(TransactionalTestExecutionListener.class).

因此,我最终通过在BoneCPDatasource上指定defaultAutoCommit=false实现了这一点。看来这对于此配置来说级别太低了,因此可能是错误的。但至少它可以工作。

是的,这无助于尝试添加
@Rollback(true)
对您的测试进行注释。谢谢。可能是因为您没有清理数据,所以没有什么不同吗?我还尝试使用rollback=true显式指定transactionmanagement。没有帮助,这是Spring设置的默认值。日志表明回滚实际上正在发生,只是似乎没有传播到数据库中你的意思是清理?回滚表明不需要显式清理?就是这样,我没有在示例中包括这个。不确定这是否会有帮助,因为它只是一个方便的类,用于处理上下文中的内容。我过去经常遇到问题,因为缺少@TestExecutionListeners(TransactionalTestExecutionListener.class)。顺便说一下,您扩展了TestCase—您使用的是哪个版本的junit?(不需要扩展Junit4中的任何内容)。
    public class CoreTest extends TestCase {

        @Inject
        protected SimpleManager<Long> simpleMgr; 

        public void baseSetup(){

            simpleMgr.flush();
                            simpleMgr.clear();

                    //after 1st test this contains all created UserRoles
            List roles = simpleMgr.getAll(UserRole.class);

            UserRole role = new UserRole(UserRole.ROLE_ANONYMOUS);
            simpleMgr.save(role);

            role = new UserRole(UserRole.ROLE_USER);
            simpleMgr.save(role);
        }
    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {
            "classpath:/spring/applicationContext.xml"
            "classpath:/spring/applicationContext-transaction.xml"})
    public class MyManagerTest extends CoreTest{

        @Before
        public void methodSetup(){

            super.baseSetup();

            role = new UserRole(UserRole.ROLE_PROUSER);
            simpleMgr.save(role);

            simpleMgr.save(userMgr.createUser("marc", "marc@gmail.com"));

            simpleMgr.flush();
        }

        @Test
        @Transactional
        public void test1(){
            ...
        }

        @Test
        @Transactional
        public void test2(){
            ....
        }
    <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="mainDataSource"/>
    </bean>

    <bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        [...]
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
        <property name="hibernateProperties">
            <value>
                hibernate.connection.driver_class=${jdbc.driverClassName}
                hibernate.jdbc.batch_size=30
                hibernate.dialect=${hibernate.dialect}
                hibernate.connection.autoReconnect=true
                hibernate.connection.autoReconnectForPools=true
                hibernate.connection.autocommit=false
            </value>
        </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
<beans xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    ...
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>