xih  
日历

导航

常用链接

留言簿(2)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
项目要求能获得CONNECTION便于对数据库的操作,并要求能与spring中的事务处于同一事务中。实现:
1.定义SanHibernateTransactionManager类,继承spring中的
HibernateTransactionManager,便于获得HibernateTransactionObject。把这个类注入到spring容器中。
< bean  id ="transactionManager"
        class
="com.san.tools.hibernate.SanHibernateTransactionManager" >
        
< property  name ="sessionFactory" >
            
< ref  bean ="sessionFactory" />
        
</ property >
    
</ bean >

 
public class SanHibernateTransactionManager extends HibernateTransactionManager{

    
public Object getTransactionObj(){
        
return super.doGetTransaction();
    }

    
        
    
public boolean existsTransaction(Object transaction){
        
return super.isExistingTransaction(transaction);
    }

    
    
public Session getSession(){
        
return SessionFactoryUtils.getSession(this.getSessionFactory(), true);
    }

    
    
public Session getCurrentSession(){
        HibernateTransactionObject obj 
= (HibernateTransactionObject)this.getTransactionObj();
        
return obj.getSessionHolder().getSession();
    }

}

2.开始事务。
public   void  beginTransaction()  throws  SQLException {
        
// TransactionDefinition.PROPAGATION_REQUIRED:支持当前的事务,如果不存在就创建一个新的。

        DefaultTransactionDefinition transactionDef  =   new  DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
        
// 创建一个TransactionStatus

        TransactionStatus transactionStatus  =  transactionManager.getTransaction(transactionDef);
        
//
取得绑定到当前线程上的session。从HibernateTransactionObject中获得,这里修改了spring中HibernateTransactionManager.java文件,
        
// 将private HibernateTransactionObject改为protected HibernateTransactionObject

        Session session  =  transactionManager.getCurrentSession();
      
if (session  !=   this .session)
{
            System.err.println(
" session不是同一对象 "
);
        }

        
// 将transactionStatus保存到集合中
         this .transactionStatuss.add(transactionStatus);
        
this .beginTransaction  =   true
;
    }
3.提交事务
public   void  commit()  throws  HibernateException,SQLException {
        
// 循环TransactionStatus集合,直至第一个transactionStatus被提交时,才真正提交

         for ( int  i  =  transactionStatuss.size()  -   1 ;i  >=   0 ;i -- ) {
            DefaultTransactionStatus transactionStatus 
=
 (DefaultTransactionStatus)transactionStatuss.get(i);
            transactionManager.commit(transactionStatus);
        }

        transactionStatuss.clear();
    }
4.回滚事务
public void rollBack(){
        
for(int i = transactionStatuss.size() - 1;i >= 0;i--){
            DefaultTransactionStatus transactionStatus 
= (DefaultTransactionStatus)transactionStatuss.get(i);
            transactionManager.rollback(transactionStatus);
        }

        transactionStatuss.clear();
    }
       贴出这段代码一是为了共享一点所得,二是希望能指出中间有什么不正确的地方(心里不是很有底)
posted on 2009-03-30 15:32 费思量 阅读(526) 评论(1)  编辑  收藏
评论:

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 费思量 Powered by: 博客园 模板提供:沪江博客