技术开发 频道

如何使用Hibernate来管理事务


示例

    到现在为止,我们已经学会如何设置、建立会话和得到一个事务。接下来我们将建立一个类,这个类将封装Hibernate框架的一些功能,从而使代码得到重用。在实现这个类之前,让我们先来学习一下什么是ThreadLocal变量。

    ThreadLocal变量和一般的通过get或set方法访问的变量不同。ThreadLocal变量是类中的私有静态(private static)变量。在我们的例子中,这个变量就是会话对象。

    上面给出了ThreadLocal变量的概念,现在让我们来举个例子看看这个变量到底是什么。我们把要实现的类命名为MyHibernate。

    下面是必须引用的包

import org.hibernate.*; import org.hibernate.cfg.*; 下面是要实现的类的框架 public class MyHibernate { … … }
    由于这个类使用的是工厂模式,因此,所有的方法必须是静态的,而且没有构造函数。虽然没有构造函数,但必须在static块中初始化。

public class MyHibernate { public static final SessionFactory sessionFactory; static { try { // 根据hibernate.cfg.xml建立SessionFactory对象 sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable e) { System.err.println("初始化错误:” + e.getMessage()); throw new ExceptionInInitializerError(e); } } … … }
    接下来声明ThreadLocal变量

public class MyHibernate{ … … public static final ThreadLocal session = new ThreadLocal(); … … } 现在来实现管理会话的方法 public class MyHibernate { … … public static Session currentSession() throws HibernateException { Session mySession = (Session) session.get(); // 得到一个会话实例 // 如果得到一个空的会话,建立一个新的会话 if (mySession == null) { mySession = sessionFactory.openSession(); // 将这个会话保存在ThreadLocal变量中 session.set(mySession); } return mySession; } public static void closeSession() throws HibernateException { Session mySession = (Session) session.get(); if (mySession != null) mySession.close(); session.set(null); } … … }
    最后,我们来实现控制事务的方法。

public class MyHibernate { … … // 返回会话工厂 public static SessionFactory getSessionFactory( ) { return sessionFactory; } // 回滚方法 public static void rollback(Transaction transaction) { if (transaction != null) { try { transaction.rollback( ); } catch (HibernateException e) {} } } // 提交事务的方法 public static void commit(Transaction transaction) { if (transaction != null) { try { transaction.commit( ); } catch (HibernateException e) {} } } }
    这个类可以使用在桌面程序中,也可以使用在Web程序中。但要注意,在Web程序中使用它时,要将hibernate.cfg.xml文件放到classes目录中。下面是一个使用这个类的例子。
import java.util.*; import com.someorg.persist.*; import org.hibernate.*; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.*; public class TestMyHibernate { HibernateFactory hf; public TestMyHibernate () {} public Info getInfo(String lower, String upper) { // 打开一个会话 Session sess = hf.getSession(); List list = sess.createCriteria(Info.class).add(Restrictions.between(lower,upper).list(); Info o=(Info)list.iterator.next(); // 得到第一条记录 hf.closeSession(); return o; } public static void main(String args[]){ Info info = TestMyHibernate().getInfo(“10”, “100”); System.out.println(“Info Id:”+ info.id); … … } }
0
相关文章