示例
到现在为止,我们已经学会如何设置、建立会话和得到一个事务。接下来我们将建立一个类,这个类将封装Hibernate框架的一些功能,从而使代码得到重用。在实现这个类之前,让我们先来学习一下什么是ThreadLocal变量。
ThreadLocal变量和一般的通过get或set方法访问的变量不同。ThreadLocal变量是类中的私有静态(private static)变量。在我们的例子中,这个变量就是会话对象。
上面给出了ThreadLocal变量的概念,现在让我们来举个例子看看这个变量到底是什么。我们把要实现的类命名为MyHibernate。
下面是必须引用的包
由于这个类使用的是工厂模式,因此,所有的方法必须是静态的,而且没有构造函数。虽然没有构造函数,但必须在static块中初始化。import org.hibernate.*;
import org.hibernate.cfg.*;
![]()
下面是要实现的类的框架
![]()
public class MyHibernate
...{
… …
}
接下来声明ThreadLocal变量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);
}
}
… …
}
最后,我们来实现控制事务的方法。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);
}
… …
}
这个类可以使用在桌面程序中,也可以使用在Web程序中。但要注意,在Web程序中使用它时,要将hibernate.cfg.xml文件放到classes目录中。下面是一个使用这个类的例子。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) ...{}
}
}
}
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);
… …
}
}
