Spring 與 Hibernate 的整合DaoImpl中Session如何獲取

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();
  }
}
相關文章
相關標籤/搜索