1

こんにちは、Spring 3.x と Hibernate 4 を使用してトランザクション管理をしようとしているときに壁に直面しました。インターネットで検索しましたが、Hibernate 3 ではこれを行う方法がありましたが、Hibernate 4 では
それほど多くはありませんでした。
私はかなり混乱しており、この設定が機能しているかどうかわかりません。

私が使用しているもの...
Spring 3.x
Hibernate 4

私はこれらを読みました
http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative
春、休止状態および宣言型トランザクションの実装: アクティブなトランザクションはありません
...

フォローアップ
クラスを正常に実行することができました。に追加proxy-target-class="true"しました

<aop:config>


しかし、これがトランザクションで実行されているかどうかはわかりません。それはtrue私が使用するときに言います

TransactionSynchronizationManager.isActualTransactionActive()

しかし、save メソッド内で意図的にエラーをスローすると、ロールバックしません。

EDIT
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


近づいていることを願っています。

EDIT
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接続プールはどのようにエラーなしで初期化されますか?

私の春のアプリケーションコンテキストは次のようになります。

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

これまでのところ、現在のスレッド例外でセッションが見つかりませんでした。
また、注釈を使用しないようにしています。
私はとても迷っています @.@ !
正しい方向に私を向けることができますか?

4

1 に答える 1

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

それ自体が注入される可能性があり、yr config はこれを追加します:

 <tx:annotation-driven transaction-manager="transactionManager"/>
于 2013-02-12T08:59:41.113 に答える