Dao层实现获取Session三个方法:
(1)继承HibernateDaoSupport类。this.getsession实际上是调用了父类HibernateDaoSupport中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session。这样做有可能有问题,尽管这种方式拿到的Session会自动关闭,但是[ a ]他是有一定的失效策略的,而且在超session池连接数的时候,spring无法自动的关闭这些session;[ b ]在Hibernate管理的类中使用Spring的类,使hibernate和Spring的耦合度变高。 注: 不推荐使用
例子:
public class PersonDAOHibernate extends HibernateDaoSupport implements PersonDAO
{
//返回全部的人的实例
public List getPersons()
{
//通过HibernateTemplate的find方法返回Person的全部实例
return getHibernateTemplate().find("from Person");
}
//删除Person实例的主键
public void removePerson(int personid)
{
//先加载特定实例
Object p = getHibernateTemplate().load(Person.class, new Integer(personid));
//删除特定实例
getHibernateTemplate().delete(p);
}
}
(2)从spring管理的sessionFactory中创建一个绑定线程的session。Spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能(),[解决了(1,3)中的问题]。 注:推荐使用
this.getHibernateTemplate().getSessionFactory().getCurrentSession();
例子:
public class PersonDAOHibernate implements PersonDAO
{
private SessionFactory sessionfactory;
//线程绑定获取session
private Session getSession()
{
return sessionfactory.getCurrentSession();
}
//返回全部的人的实例
public List getPersons()
{
String sql = "";
sql = "from User user where user.userId not in ("+userIds+") order by user.createTime desc";
Query query = getSession().createQuery(sql);
return query.list();
}
}
(3)从spring管理的sessionFactory中创建一个session。此session不是线程绑定的。当执行完一个实务的时候自动关闭session。这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了,[从在(1)中的问题]。注: 不推荐使用
this.getHibernateTemplate().getSessionFactory().OpenSession。
例子:
public class PersonDAOHibernate implements PersonDAO
{
public List getPersons()
{
String sql = "";
sql = "from User user where user.userId not in ("+userIds+") order by user.createTime desc";
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
Query query = session.createQuery(sql);
return query.list();
}
}