上一篇介绍了如何在ssh环境中配置Hibernate框架,本篇介绍如何基于Hibernate框架编写DAO
1. Hibernate框架相关接口
Hibernate体系结构如图所示,下面介绍Hibernate体系结构中常用的类
SessionFactory
配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。
SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。
Session
一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。
Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。
Transaction
一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。
这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。
Query 对象
Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。
2. 基于Hibernate实现DAO
spring-hibernate3.jar中提供了HibernateDaoSupport抽象类,用于编写基于Hibernate的DAO实现,该类提供了丰富的方法,便于对数据库进行增删该查,继承Hibernate类后,需要定义setHibernateSessionFactory方法,使spring可以将容器中的sessionFactory组件注入给DAO。使用getSession可以获得相应的Sesssion对象package com.bs_circle.dao;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import com.bs_circle.entity.User;
@Repository
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
//通过该方法注入sessionFactory对象
@Resource(name = "sessionFactory")
public void setHibernateSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
public void save(User user) {
getHibernateTemplate().save(user);
}
public User findById(String id) {
return (User)getHibernateTemplate().get(User.class, id);
}
public void update(User user) {
getHibernateTemplate().update(user);
}
public User findByName(String name) {
Session session = getSession();
Query query = session.createQuery(FIND_BY_NAME_HQL);
query.setString(0, name);
User u = (User) query.uniqueResult();
return u;
}
}
注意由于Session代表与数据库的链接,因此开启后需要手动关闭,但是因为Hibernate的延时加载特性,如果在加载前提前关闭Session会在真正需要查询时抛出异常。方便的做法是采用事物进行统一管理@Transactional,spring在提交事物后会自动关闭数据库链接。更多解决方案参考http://blog.sina.com.cn/s/blog_864f40cb01017oef.html