プログラミングトランザクションと宣言トランザクション

7847 ワード

プログラミングトランザクションと宣言トランザクション
一、プログラミング事務:
 
トランザクションに関する2つのキーコードのみを以下に示します.
hibernate.cfg.xml
  
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
   
    <property name="hibernate.current_session_context_class">thread</property>
   
    <mapping resource="com/bjsxt/usermgr/model/Log.hbm.xml" />
       <mapping resource="com/bjsxt/usermgr/model/User.hbm.xml" />
  </session-factory>
package com.bjsxt.usermgr.manager;
 
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;
 
public class LogManagerImpl implements LogManager {
 
       public void addLog(Log log) {
              HibernateUtils.getSessionFactory().getCurrentSession().save(log);
       }
 
} 

                  
package com.bjsxt.usermgr.manager;
 
import java.util.Date;
 
import org.hibernate.HibernateException;
import org.hibernate.Session;
 
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;
 
public class UserManagerImpl implements UserManager {
 
                      public void addUser(User user) {
                                   Session session = null;
                                   try {
                                          session = HibernateUtils.getSessionFactory().getCurrentSession();
                                          session.beginTransaction();
                                         
                                          session.save(user);
                                          Log log = new Log();
                                          log.setType("    ");
                                          log.setDetail("***    !");
                                          log.setTime(new Date());
                                         
                                          LogManager logManager = new LogManagerImpl();
                                          logManager.addLog(log);
                                         
                                          session.getTransaction().commit();
                                   } catch (HibernateException e) {
                                          e.printStackTrace();
                                         
                                          session.getTransaction().rollback();
                  } //finally {
                                   //     session.close();
                                   //}
 
                      }
 
}

注意:1.getCurrentSession()とgetSession()の違い
※getCurrentSession()で作成したSessionは現在のスレッドにバインドされますが、openSession()で作成したsessionは
※getCurrentSession()で作成したSessionはcommitまたはrollbackで自動的に閉じますが、openSessionで作成したsession()は手動で閉じる必要があります
2.getCurrentSession()を使用して作成するセッションはhibernateである必要があります.cfg.xmlには、次の構成が追加されています.
※ローカル取引の採用:
                         
 <property name="hibernate.current_session_context_class">thread</property>

※jtaトランザクション採用:
<property name="hibernate.current_session_context_class">jta</property>

二、声明式事務
※宣言トランザクション構成
●SessionFactoryの構成
●取引マネージャの構成
●取引の伝播特性
●それらの方法はトランザクションを使用する
※業務ロジックの作成方法
●HibernateDaoSupportクラスを継承し、HibernateTemplateを使用して永続化し、HibernateTemplateクラスはHibernate Sessionの軽量パッケージである
●運転期間異常はデフォルトでロールバックされます(RuntimeExceptionを継承したサブクラスを含む).通常異常はロールバックされません
●ビジネスロジックメソッドを記述する際には異常を常に上に投げて表示層(struts)で処理することが望ましい
・業務境界の設定については、通常、業務層に設定されており、DAOに追加しないでください.
ApplicationContext.bean.xml   
    
<!--   sessionFactory -->
    <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="configLocation">
           <value>classpath:hibernate.cfg.xml</value>
       </property>
    </bean>   
   
    <!--         -->
    <bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       <property name="sessionFactory">
           <ref local="sessionFactory"/>
       </property>
    </bean>
   
    <!--        -->      
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="del*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="deploy*" propagation="REQUIRED"/>
        <tx:method name="submit*" propagation="REQUIRED"/>
        <tx:method name="*" read-only="true"/>
       
    </tx:attributes>
    </tx:advice>
   
    <!--                -->
    <aop:config>
    <aop:pointcut id="allManagerMethod" expression="execution (* com.bjsxt.usermgr.manager.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
    </aop:config>   
   
</beans>

 
ApplicationContext.common.xml
    
<bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl">
       <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl">
       <property name="sessionFactory" ref="sessionFactory" />
       <property name="logManager" ref="logManager"></property>
    </bean>
</beans>

 
LogManagerImpl.java
package com.bjsxt.usermgr.manager;
 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
import com.bjsxt.usermgr.model.Log;
 
public class LogManagerImpl extends HibernateDaoSupport implements LogManager {
   
    public void addLog(Log log) {
       this.getHibernateTemplate().save(log);
    }
 
}

UserManagerImpl.java
package com.bjsxt.usermgr.manager;
 
import java.util.Date;
 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
 
public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
   
    private LogManager logManager;
 
    public void setLogManager(LogManager logManager) {
       this.logManager = logManager;
    }
 
    public void addUser(User user) {
           this.getHibernateTemplate().save(user);
          
           Log log = new Log();
           log.setType("    ");
           log.setDetail("***    !");
           log.setTime(new Date());
           logManager.addLog(log);
    }
 
}