SSH整合——Hibernate模板的使用与延迟加载问题的解决

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的配置的前面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值