【问题标题】:Transaction Management in Spring 3.x and Hibernate 4Spring 3.x 和 Hibernate 4 中的事务管理
【发布时间】:2013-01-27 12:36:01
【问题描述】:

您好,我在尝试使用 Spring 3.x 和 Hibernate 4 进行事务管理时遇到了障碍。
我在互联网上搜索过,但在 Hibernate 3 中有一些方法可以做到这一点,而在 Hibernate 4 中没有这么多。
我很困惑,我不确定这个设置是否有效。

我正在使用的东西...
春天 3.x
休眠 4

我读过这些
http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative
spring, hibernate and declarative transaction implementation: there is no active transaction
还有更多...

跟进
我已经成功地运行了我的课程。我已将proxy-target-class="true" 添加到

<aop:config>


但我不确定这是否在事务中运行。当我使用

时,它会显示 true
TransactionSynchronizationManager.isActualTransactionActive()

但是当我故意在 save 方法中抛出错误时,它不会回滚。

编辑
正如 NimChimpsky 所建议的那样,我尝试通过 Spring MVC(dispatcher servlet) 调用相同的方法,它说

    Cannot convert value of type 
[$Proxy19 implementing kr.co.sgis.services.web.cooingbee.Crudable,org.springframework.aop.SpringProxy,
org.springframework.aop.framework.Advised] to required type
[test.TXTestDAO] for property 'dao': 
no matching editors or conversion strategy found


我希望我越来越近了。

编辑
log4j 是这么说的。

INFO : org.hibernate.Version - HHH000412: Hibernate Core {4.1.7.Final}
INFO : org.hibernate.cfg.Configuration - HHH000041: Configured SessionFactory: null
INFO : com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1bqomxn8s1l3dkxojzz69x|e4865ce, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1bqomxn8s1l3dkxojzz69x|e4865ce, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://211.115.111.229:3306/yoursmart, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 50, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
INFO : org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
INFO : org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
INFO : org.hibernate.engine.transaction.internal.TransactionFactoryInitiator - HHH000399: Using default transaction strategy (direct JDBC transactions)
INFO : org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory - HHH000397: Using ASTQueryTranslatorFactory


它确实说 ' Configured SessionFactory: null''TransactionFactoryInitiator - HHH000399: Using default transaction strategy (direct JDBC transactions)' 但是 c3p0 连接池如何初始化不出错?

我的 Spring 应用程序上下文如下所示。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource"><ref bean="dataSource"/></property>
    <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
    </property>

</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="****"></property>
    <property name="user" value="****"></property>
    <property name="password" value="****"></property>
    <property name="initialPoolSize"><value>3</value></property>
    <property name="minPoolSize"><value>3</value></property>
    <property name="maxPoolSize"><value>50</value></property>
</bean>

<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>


<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<bean id="txDAO" class="test.TXTestDAO">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
<bean id="testTxService" class="test.TXTestService">
        <property name="dao" ref="txDAO"/>
    </bean>


hibernate.cfg.xml

         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
         <property name="connection.url">****</property>
         <property name="connection.username">****</property>
         <property name="connection.password">****</property>
         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
         <property name="connection.pool_size">5</property>
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
          <property name="hibernate.c3p0.min_size">5</property>
          <property name="hibernate.c3p0.max_size">20</property>
          <property name="hibernate.c3p0.timeout">300</property>
          <property name="hibernate.c3p0.max_statements">50</property>
          <property name="hibernate.c3p0.idle_test_period">3000</property>



TXTestDAO.java
我的 DAO 没有实现 HibernateDAOSupport。我必须实现它吗?

public int save(CooingbeeFetchable bean) {
        // TODO Auto-generated method stub
        try{

            sessionFactory.getCurrentSession().getTransaction().begin();
            //Using sessionFactory is low level
            sessionFactory.getCurrentSession().save(bean);

            sessionFactory.getCurrentSession().getTransaction().commit();
            System.out.println("committed");

        }catch(Exception e){
            e.printStackTrace();
        }
        return 0;
    }


我的测试类
我刚刚使用 FileSystemResource 进行测试。

public class Tester {       
public static void main(String[] args){

            FileSystemResource fSysSrc = new FileSystemResource("C:\\SGI_Project\\eclipseWorkspace\\SPSWeb\\WebContent\\WEB-INF\\SpringDispatcher-servlet.xml");
            BeanFactory xmlBeanFactory = new XmlBeanFactory(fSysSrc);
            TXTestService txDAO= (TXTestService) xmlBeanFactory.getBean("testTxService");

            TXTestBean bean = new TXTestBean();

            bean.setName("bodybody");
            txDAO.save(bean);

        }
    }


public class TXTestService implements Crudable{

    private TXTestDAO dao;

    public void setDao(TXTestDAO nDAO){
        dao = nDAO;
    }
public int save(CooingbeeFetchable bean) {
        // TODO Auto-generated method stub
        return dao.save(bean);
    }
}

到目前为止,我没有找到当前线程异常的会话。
我也尽量不使用注释。
我感到很失落 @。@ !
你能指出我正确的方向吗?

【问题讨论】:

标签: spring hibernate spring-transactions


【解决方案1】:

XMLBean 工厂已被弃用,如果可以的话,我建议使用注释和最新最好的 spring 版本(spring 3.2 的测试功能很棒)。它会为你简化一些事情,dao/repository 可以有这个

@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;

@Transactional(propagation = Propagation.REQUIRED)
 public T save(final T o) {
        return (T) sessionFactory.getCurrentSession().save(o);
    }

然后可以将其本身注入,并在您的配置中添加:

 <tx:annotation-driven transaction-manager="transactionManager"/>

【讨论】:

  • 哦,谢谢,但我尽量不使用注释。我也知道 XMLBeanFactory 已被弃用。我只是用它们来测试。你能帮我在没有注释的情况下做同样的事情吗?谢谢:)
  • @PerfectGundam 我不确定,但使用 XMLBeanFactory 是否意味着 bean 由 spring 管理 - 我感觉它没有,这意味着不会绑定任何会话。我认为这是说明为什么注释非常好的完美示例 - 我不熟悉您使用的所有 xml 配置。调高您的日志记录级别...并检查您的日志,会话未绑定的原因将在那里(可能就像使数据库连接不正确一样简单)。我不会使用已弃用的类进行测试,只需设置适当的单元测试即可。
  • @NimChipsky 我认为 XMLBeanFactory 管理 XML 中定义的 bean,但可能不是。我试图通过 Spring MVC 调用相同的方法,它说'无法转换类型的值 [$Proxy19 实现 kr.co.sgis.services.web.cooingbee.Crudable,org.springframework.aop.SpringProxy,org.springframework.aop .framework.Advised] 为属性“dao”所需的类型 [test.TXTestDAO]:找不到匹配的编辑器或转换策略”
  • 你正在使用一个已弃用的类和一个旧版本的 spring。获取新版本并关注示例项目...
猜你喜欢
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 2016-12-02
  • 1970-01-01
  • 2012-10-16
  • 2015-09-07
  • 2013-07-22
相关资源
最近更新 更多