4

SpringとHibernateを使用してプロジェクトを作成し始めたところです。私のDAOレイヤークラスはHibernateDaoSupportを拡張します。アノテーションは使用していません。以前はstrutsを使用していたため、Sessionクラスによって提供されるgetTransaction、commit、rollback..メソッドを使用しました。私の要件は非常に単純です。すべてのDAOクラスで、例外がある場合はロールバックし、そうでない場合はコミットします。春のトランザクション管理を導入する最も簡単な方法を提案してください。

4

1 に答える 1

12

あなたの質問からは、いくつかのことが明確ではありません。私の説明は、以下の仮定に基づいています-

  • Spring を使用してデータソースとセッション ファクトリを作成しています
  • Java 5 以降を使用しており、注釈を使用できます。

スプリングの構成は次のようになります。

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<bean id="mySessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="mappingResources">
        <list>
            <value>product.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.HSQLDialect
        </value>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean> 

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

これが設定されると、以下に示すように、DAO メソッドでスプリング トランザクション アノテーションを使用できます。Spring は、例外がスローされたときに、トランザクションの開始、トランザクションのコミット、またはトランザクションのロールバックを処理します。ビジネス サービスがある場合は、DAO の代わりにトランザクション アノテーションをサービスに使用するのが理想的です。

@Transactional(propagation=Propagation.REQUIRED)
public class MyTestDao extends HibernateDaoSupport {    
public void saveEntity(Entity entity){
    getHibernateTemplate().save(entity);
}
@Transactional(readOnly=true)
public Entity getEntity(Integer id){
    return getHibernateTemplate().get(Entity.class, id);
}
 }

以下のコードは、アノテーションではなくSpringのAOPサポートを使用してトランザクション管理を実現する方法を示しています。

    <!-- Define your 'myDatasource' bean and 'mySessionFactory' bean as shown in previous code snippet -->
<!--  Then follow the steps shown below -->

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory" />   

<!-- this is the dao object that we want to make transactional -->
<bean id="testDao" class="com.xyz.daos.MyTestDao" />

<!-- the transactional advice  -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- all methods starting with 'get' are read-only -->
        <tx:method name="get*" read-only="true" />
        <!-- other methods use the default transaction settings (see below) -->
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<!-- ensure that the above transactional advice runs for any execution of 
    a method in 'daos' package-->
<aop:config>
    <aop:pointcut id="allDaoMethods"
        expression="execution(* com.xyz.daos.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allDaoMethods" />
</aop:config>

詳細については、 Spring Declarative Transactionsを参照してください。

于 2012-10-26T15:47:57.943 に答える