富客户端程序设计实例 - DAO层 - DAO 与 Hibernate 的 SessionFactory
实际上 Spring 在整个DAO层面上一般只做了2 件事:@Repository托管存储层Bean,@Resource实例化org.hibernate.SessionFactory;和Assert.notNull(list, "entity is required");提供断言支持。代码如下:
- public class EmployeeDaoImpl implements BaseDao
- {
- //Spring的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。
- protected SessionFactory sessionFactory;
- public Session getSession()
- {
- return sessionFactory.getCurrentSession();
- }
- @Resource
- public void setSessionFactory(SessionFactory sessionFactory)
- {
- this.sessionFactory = sessionFactory;
- }
- /**
- * public <T> void saveInfo(List<T> list) 这是一个方法级别的泛型结构
- * T代表泛型,他也可以是其他字母,如:P、E、Q
- *
- * Assert.notNull(list, "entity is required"); 这是一个断言
- * 表示list如果为空,则不再继续执行下面的语句,转而在
- * 控制台上输出: "entity is required"
- *
- * **/
- public <T> void saveInfo(List<T> list)
- {
- Assert.notNull(list, "entity is required");
- for (T obj : list)
- {
- getSession().save(obj);
- }
- System.out.println("Function saveInfo has run");
- }
- @Override
- public <T> void updateInfo(List<T> list)
- {
- Assert.notNull(list, "list不能为空");
- for (T obj : list)
- {
- getSession().update(obj);
- }
- System.out.println("Function updateInfo has run");
- }
- public <T> List<T> find(Class<T> cla)
- {
- Assert.notNull(cla, "class不能为空");
- String hql = "from " + cla.getName();
- return getSession().createQuery(hql).list();
- }
- public <T> void saveOrUpdate(List<T> list)
- {
- Assert.notNull(list, "list不能为空");
- for (T obj : list)
- {
- getSession().saveOrUpdate(obj);
- }
- }
- public <T> void delete(List<T> list)
- {
- Assert.notNull(list, "list不能为空");
- for (T obj : list)
- {
- getSession().delete(obj);
- }
- }
- }
从3.0.1版本开始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。基于这一点,采用JTA的上下文相关session可以满足你一切需要。
如果使用的是全局事务(JTA事务):getCurrentSession () 使用当前的session; openSession() 重新建立一个新的session。如果使用getCurrentSession来创建session,在commit后,session自动被关闭,不用再session.close()。如果使用的是openSession方法创建的session,必须显示的关闭session,也就是调用session.close()方法。
在一个应用程序中,如果DAO 层使用Spring 的 Hibernate 模板,通过Spring 来控制 session 的生命周期,则首选getCurrentSession()。
本质上,SessionFactory.getCurrentSession();调用了org.hibernate.impl.SessionImpl.java中对应的方法;这个类实现了org.hibernate.Session接口。这个类中对应的方法有很多,常用的有这些:save()、update()、delete() 和 public Query createQuery(String queryString) 。createQuery需要调用Query类中的list()方法。