首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate 对事宜的支持

2012-06-28 
Hibernate对事务的支持我们这里只讨论Hibernate 对事务的支持,注意没有涉及到Spring 跟Hibernate 集成这个

Hibernate 对事务的支持

我们这里只讨论Hibernate 对事务的支持,注意没有涉及到Spring 跟Hibernate 集成这个问题将放到以后再讨论。

?

在Hibernate 里面也定义了一个接口 Transactionpublic void begin() throws HibernateException;

Session sess = factory.openSession();   Transaction tx;   try {       tx = sess.beginTransaction();       //do some work       ...       tx.commit();   }   catch (Exception e) {       if (tx!=null) tx.rollback();       throw e;   }   finally {       sess.close();   }
?这个Session 的实现类是SessionImpl, 在SessionImpl.beginTransaction() 方法中几个的思路就是根据 configruation 信息 获取到Transaction, 然后调用transaction.begin() 方法。

Hibernate 里面的Transaction 有两个最常见的实现JTATransaction, ?JDBCTransaction。 根据配置信息的不一样,?beginTransaction得到就是这两个类得不同实例。 ? 在实现这两个类得时候, Hibernate 还有个这个Session需要处理。 这个Session里面managed bean 需要flush, 通常在 这个 commit 方法要先调用 manageFlush 来强制cache 中的状态同步到数据库。

JTATransaction 实现的思路 技术上是begin() 的时候 通过jndi 找到 UserTransaction, 这个UserTransaction 开始就意味着global transaction 开始了。 同时利用JTA 事务的Syncronization 机制注册个?CacheSynchronization。 这个?CacheSynchronization 会在 JTA 事务 开始提交前 和提交后 分别 flush 和 close
JTATransaction? 的?commit 方法 差不多是 ?先 managedFlush , 然后?UserTransaction.commit

JDBCTransaction 的事务的思路呢 begin 时 得到 那个jdbc connection, 修改它的 AutoCommit 成 false 就意味着 jdbc 事务开始了.
commit 的时候呢 同样也要先 Session flush, 然后找到那个 connection 去 commit(), ?完了如果有必要恢复 AutoCommit 成 true 的话就 reset 回去。?

这里只是简单介绍Hibernate 对事务的处理, 至于Spring 对事务的处理在以后的文章中会提到。?

热点排行