0

@Transactional アノテーションを使用して、Spring アプリケーションを介してテーブルの 1 つにデータを挿入することをテストしています。テストは成功しましたが、テーブルにデータが挿入されていません。

関連するコード スニペットは次のとおりです。

マイテスト:

@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 に答える