0

我正在使用 @Transactional 注释来测试通过 Spring 应用程序将一些数据插入到其中一个表中。我的测试成功了,但我没有看到任何数据被插入到表中。

以下是相关的代码片段:

我的测试:

@TransactionConfiguration(transactionManager="MyTxManager")
@Transactional
public class MyTest {
    @Autowired
    private DataProvider provider;

    @Test
    @Transactional
    void testInsert() {
        Order purchaseOrder = new Order("ID1", "LER", "VDR1", 0, );
        provider.addRow(purchaseOrder);
    }

}

数据提供者:

public class DataProvider extends DatabaseProvider {

    // some stuff...
    @Transactional
    public void insertRow(Order purchaseOrder) {
        /* 
         * SessionFactory is got through autowiring 
         * and is working perfectly fine.
         */
        Session session = sessionFactory.getCurrentSession();

        // This should save the row into the table - which it doesn't :(
        session.save(purchaseOrder);

    }

}

信息提供者.xml

<bean id="DataProvider" class="com.util.DataProvider">
    <property name="sessionFactory" ref="MySessionFactory" />
</bean>

hibernate.xml 包含会话工厂的配置

 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
      parent="AbstractSessionFactory" depends-on="EnvironmentHelper">
    <property name="hibernateProperties">
      <props>
         <prop key="hibernate.connection.autocommit">true</prop>
         <prop key="hibernate.connection.provider_class">com.hibernate.ConnectionPool</prop>
         <prop key="hibernate.connection.driver_class">${driverClassName}</prop>
         <prop key="hibernate.connection.url">${databaseURL}</prop>
         <prop key="hibernate.connection.username">${databaseUsername}</prop>
         <prop key="hibernate.connection.password">${databasePassword}</prop>

         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
         <prop key="hibernate.default_schema">${databaseDefaultSchema}</prop>
      </props>
    </property>
</bean>

<!-- Use Spring transactions for Hibernate -->
<tx:annotation-driven transaction-manager="MyTxManager" mode='proxy' proxy-target-class='true'/>

<bean id="MyTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory" ref="MySessionFactory" />
</bean>    
</beans>
4

3 回答 3

2

我认为回滚交易的问题。请参阅此处的defaultRollback方法。试试这样:

@TransactionConfiguration(transactionManager="MyTxManager", defaultRollback=false)
于 2013-03-13T09:42:53.213 回答
1

MyProvider myProviderInstance = new MyProvider(); 您的问题是myProviderInstance不是由 Spring 容器维护的,您只是新建了它,所以 Spring 对此无能为力,肯定事务不起作用。您应该在 Spring applicationcontext.xml 中配置 bean 并使用 ApplicationtContext 加载它,您可以在 google 后找到数十个示例。而且由于您使用的是 Mysql,因此您应该确保您使用的是 innerDB 模式,否则 mysql 不支持该事务。

于 2013-03-13T06:38:56.903 回答
0

将该行添加<tx:annotation-driven/>到您的弹簧配置中

于 2013-03-13T06:34:02.380 回答