Dao層實現獲取Session三個方法:java
(1)繼承HibernateDaoSupport類。this.getsession其實是調用了父類HibernateDaoSupport中的方法得到session。使用spring管理hibernate的SessionFactory的時候,這個方法會從session池中拿出一session。這樣作有可能有問題,儘管這種方式拿到的Session會自動關閉,可是[ a ]他是有必定的失效策略的,並且在超session池鏈接數的時候,spring沒法自動的關閉這些session;[ b ]在Hibernate管理的類中使用Spring的類,使hibernate和Spring的耦合度變高。 注: 不推薦使用spring
例子:sql
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)中的問題]。 注:推薦使用session
this.getHibernateTemplate().getSessionFactory().getCurrentSession();性能
例子:this
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)中的問題]。注: 不推薦使用spa
this.getHibernateTemplate().getSessionFactory().OpenSession。.net
例子:hibernate
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(); } }