【问题标题】:insert into table using hibernate @Transactional使用休眠@Transactional插入表
【发布时间】:2013-02-28 11:54:18
【问题描述】:

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

以下是相关代码sn-ps:

我的测试:

@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);

    }

}

information-providers.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>

【问题讨论】:

    标签: mysql spring hibernate spring-mvc transactions


    【解决方案1】:

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

    @TransactionConfiguration(transactionManager="MyTxManager", defaultRollback=false)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我刚刚为这个问题添加了更多相关的代码 sn-p。我实际上是使用信息提供者来获取提供者实例(请参阅代码)。另外,您能否详细说明一下:“innerDB 模式”是什么意思?
      • 稍后我会检查您的代码,此链接解释了 innerDB:dev.mysql.com/doc/refman/5.0/en/innodb-storage-engine.html
      【解决方案3】:

      &lt;tx:annotation-driven/&gt; 行添加到您的弹簧配置中

      【讨论】:

      • 它已经在那里了。请看一下更新后的代码sn-ps。
      猜你喜欢
      • 2018-12-31
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多