1. 模板的CRUD操作
1.1 保存
public void save(Customer customer) {
System.out.println("dao save ... ");
this.getHibernateTemplate().save(customer);
}
1.2 更新
public void update(Customer customer) {
this.getHibernateTemplate().update(customer);
}
1.3 删除
public void delete(Customer customer) {
this.getHibernateTemplate().delete(customer);
}
1.4 查询
1.4.1 查询单个对象
public Customer findById(Long id) {
return this.getHibernateTemplate().get(Customer.class, id);
}
1.4.2 查询所有(HQL方式)
public List<Customer> getALlByHQL() {
return (List<Customer>) this.getHibernateTemplate().find("from Customer");
}
1.4.3 查询所有(QBC方式)
public List<Customer> getALlByQBC() {
// 条件
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
// 没有条件,传递一个空的条件对象
return (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
}
注意:在实际开发中,条件一般都是前面传递进来的。
2. 延迟加载的解决
在做查询的时候会出现延迟加载的问题,该现象在hibernate的时候就有了,但是hibernate没有给出具体的解决方案,在spring中提供了延迟加载的解决方案。
2.1 出现延迟加载的场景
1. 使用load方法查询某个对象的时候。
2. 查询到某个对象以后,显示其关联的对象。
注意:这里为什么会出现延迟加载了,是因为我们的关联对象,默认都是采用的懒加载
2.2 延迟加载的解决
我们默认情况下,会在service中进行的事务的开启和关闭,当进入到web层的时候,session已经关闭了,关联对象还没有被查询,所以查询不到关联的对象,要解决该问题,只需要让session在web层不关闭即可。
延迟加载异常通常会报一个no session的异常。
2.2.1 解决方案一(不推荐)
1. 在关联的对象的映射文件的class标签加一个lazy的属性,属性值为false
<class name="com.itcast.ssh.domain.Customer" lazy="false" table="cst_customer">
2. 关联的配置也就是many-to-one也加上lazy=false
<many-to-one name="user" lazy="false" class="" column="u_cust_id"></many-to-one>
说明:该方式可以解决延迟加载问题,但是效率太低,不推荐使用
2.2.2 解决方案二
使用spring提供的延迟加载的解决方案:OpenSessionViewFilter,提供了一个视图层的过滤器,可以在web层开启session。
操作方法:
在web.xml中配置OpenSessionViewFilter
<!-- 解决延迟加载问题的过滤器 -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
注意:过滤器有一个执行的顺序,OpenSessionViewFilter的位置要位于Struts2的配置的前面