1.HibernateTemplate使用方式
//添加方法
public void add(User u){
this.getHibernateTemplate().save(u);
}
//刪除方法
public void delete(User u){
this.getHibernateTemplate().delete(u);
}
//修改方法
public void update(User u){
this.getHibernateTemplate().update(u);
}
//按uuid查詢實體
public User getByUuid(Long uuid){
return this.getHibernateTemplate().get(User.class,uuid);
}
//返回全部數據集合
public List<User> getAll(){
return this.getHibernateTemplate().find("from User");
}
//返回分頁集合數據
public List<User> getAll(int pageNum,int prePageNum){
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
return this.getHibernateTemplate().findByCriteria(dc, (pageNum-1)*prePageNum, prePageNum);
}
2.No Session問題
前提:
1.load方法是延遲加載的(所有存在延遲加載現象的操作)
2.業務邏輯層並沒有加載該數據的延遲數據
3.表現層獲取時事務已經關閉,所以該對象無法支持延遲加載,造成noSession問題
解決方案:(方案2更靈活)
1.
<set name="mealPojo" inverse="true" lazy="false"
fetch="join" cascade="all">
2.Hibernate提供了一個工具方法,用於將一個延遲加載的對象中的數據全部立即加載
Hibernate.initialize(u);
3.將事務開到表現層,添加OpenSessionInViewFilter
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
說明:
A. OpenSessionInView過濾器必須在struts2的核心過濾器之前開啓,否則struts2獲取數據時,仍然會出現Session已經關閉的現象
B.如果使用OpenSessionInView過濾器時,出現FlushModel相關的異常,換用如下過濾器,將事務設置爲自動事務,而不是隻讀事務
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>