当前位置: 首页 > 面试题库 >

Spring 3.x和Hibernate 4中的事务管理

楚建柏
2023-03-14
问题内容

您好我已经面对一堵墙,而我试图使用Spring 3.x和hibernate4.做交易管理
我搜索在互联网上,但有办法在hibernate3要做到这一点,没有那么多的hibernate4.
I”我很困惑,我不确定此设置是否有效。

我正在使用的东西…
Spring 3.x
Hibernate 4

我已经阅读了这些
http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-
declarative spring,hibernate和声明式事务的实现:没有活动的事务
,还有更多事务 …

后续
我已经成功地运行了我的课程。我已添加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);
    }
}

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


问题答案:

不推荐使用XMLBean工厂,如果可以的话,我建议您使用注释和最新最好的Spring版本(spring 3.2的测试功能很棒)。它将为您简化一些事情,Dao/存储库可能有此功能

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

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

然后可以将其本身注入,并在yr config中添加以下内容:

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


 类似资料:
  • 在我的项目中,我一直在使用Spring3和Hibernate4。我已经添加了支持Spring3和Hibernate4项目的所有依赖项。我并不特定于hibernate上的版本,但它应该支持Spring3。 当我尝试在Tomcat7项目上部署时,我得到了以下异常。 原因:org。springframework。豆。工厂BeanCreationException:无法自动关联字段:私有组织。冬眠Sess

  • 管理交易 在 1.4 版更改: 对会话事务管理进行了修改,使其更清晰、更易于使用。特别是,它现在具有“autobegin”操作的特点,这意味着事务开始的点可以被控制,而不必使用传统的“autocommit”模式。 这个 Session 一次跟踪单个“虚拟”事务的状态,使用一个名为 SessionTransaction 。然后,该对象利用基础的 Engine 或引擎,而这些引擎 Session 对象

  • 问题内容: 我正在编写一个使用GWT,Hibernate和Google Guice(带有GIN)的相当简单的应用程序。我想做的是使用外部管理器(例如在Spring中使用)来管理事务 ,而不是使用。我尝试使用,但似乎不适用于我。 我已经使用注入了EntityManager ,如下所示: 手动管理事务时,它似乎可以正常工作。我希望自动管理事务,也希望使用DBUnit进行自动化测试。 有人知道如何解决吗

  • 我需要执行父任务,父任务可能有子任务,也可能没有子任务。每个父任务和子任务都应该在线程中运行。如果父任务或子任务执行中出现错误,则必须回滚父任务和子任务的事务。我正在使用hibernate4。

  • 我正在使用带有spring jdbc事务支持的spring jdbc。 这是我的配置。 使用这个配置,事务对我来说不起作用。我不确定原因,但我能理解的是- 如您所见,jdbcTemplate()和txManager(),这两个方法都调用getDataSource()方法,该方法inturn创建JDBCDataSource。我认为在这两个方法中,我都创建了两个jdbc数据源,因此jdbcTempla

  • 在db会话监视器中,当这种情况发生时,我得到了一个不活动的事务。 我得到的错误如下: 问题是交易和连接应该自动打开和关闭...我希望并发修改失败的事务得到回滚...但似乎他们变得不活跃了。