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>