事务在Hibernate以及JPA中的应用(一)
首先需要声明的是,hibernate本身没有事务功能。它只是借助JDBC事务,或者JTA事务来实现事务的管理,它只是封装了事务的使用方法。一般事务控制定界到service层,但是为了方便,以下的代码将事务代码放在Dao层。事务在Hiibernate中的应用具体可以分为一下三部分:
1 JDBC事务在Hibernate的应用。如果我们系统不需要分布式的话,那么就可以采用JDBC事务来提供事务服务。要想在Hibernate里使用 JDBC事务,我们必须要配置如下属性:hibernate.transaction.factory_class=org.hiberante.transaction.JDBCTransactionFactory.
在此种情况下典型的编码方式如下:
Java代码
public class XXXDao ...{ Session session ; Transaction tx ; public void crudOperation(){ try{ session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); //完成具体的CRUD操作。 tx.commit(); }catch(RuntimeException e){ tx.rollback(); }finally{ this.getSession().close(); } } } public class XXXDao ...{Session session ;Transaction tx ;public void crudOperation(){try{session = HibernateUtil.getCurrentSession();tx = session.beginTransaction();//完成具体的CRUD操作。tx.commit();}catch(RuntimeException e){tx.rollback();}finally{this.getSession().close();}}} public class XXXDao ...{ Session session ; UserTransaction utx = (UserTransaction)ServiceLocator.getUserTransaction("JNDIName") ; public void crudOperation(){ try{ utx.begin(): session = HibernateUtil.getCurrentSession(); //完成具体的CRUD操作。 utx.commit(); session.flush();//此时需要程序来flush session }catch(RuntimeException e){ utx.rollback(); //日志记录等 }finally{ this.getSession().close(); } } } public class XXXDao ...{Session session ;UserTransaction utx = (UserTransaction)ServiceLocator.getUserTransaction("JNDIName") ;public void crudOperation(){try{ utx.begin():session = HibernateUtil.getCurrentSession();//完成具体的CRUD操作。utx.commit();session.flush();//此时需要程序来flush session}catch(RuntimeException e){utx.rollback();//日志记录等}finally{this.getSession().close();}}}