一、异常内容
could not initialize proxy - no Session
二、异常原因分析
首先在我的持久化类User中有如下片段:
//User.java
@Entity
@Table(name = "user_inf")
public class User {
//用户的订单信息
@OneToMany(targetEntity=Order.class,mappedBy="user")
private Set<Order> orders=new HashSet<Order>();
//省略其他内容
}
控制器代码片段如下:
//GoodAction.java
/**
* 提交订单,只有用户才能操作
* @return
*/
public String submitOrder(){
//省略部分代码
User user=userService.find(tel, password);
//权限验证通过,提交订单获取提交状态
boolean result=goodService.submit((User)object,id);
if(result) return SUCCESS;
return ERROR;
}
用户的业务逻辑组件代码片段如下:
//UserServiceImpl.java
@Override
public User find(String tel, String password) {
List<User> list=userDao.find("select u from User u left join fetch u.orders where u.tel=? and u.password=?",tel,password);
return list.size()==0?null:list.get(0);
}
商品业务逻辑组件代码片段如下:
//GoodServiceImpl.java
@Override
public boolean submit(User user, Serializable goodId) {
//省略一部分不相关的东西
//下行代码会出错
user.getOrders().add(order);
return true;
}
可知罪魁祸首就是下面几行代码:
//系统在这行代码处报错
user.getOrders().add(order);
真正的错误位置是下面的hql语句位置:
//UserServiceImpl.java
@Override
public User find(String tel, String password) {
List<User> list=userDao.find("select u from User u left join fetch u.orders where u.tel=? and u.password=?",tel,password);
return list.size()==0?null:list.get(0);
}
系统给了我们提示:当前的session处于关闭状态,而在加载user对象的并没有获取到它的orders属性,因为Hibernate对持久化集合的处理方法默认是使用延迟加载的方式,并其在查询并没有指定不使用延迟加载,所以才会出现异常。
三、异常解决
//UserServiceImpl.java
@Override
public User find(String tel, String password) {
List<User> list=userDao.find("select u from User u left join fetch u.orders where u.tel=? and u.password=?",tel,password);
return list.size()==0?null:list.get(0);
}
可知在hql语句中加了一句话:
left join fetch u.orders
它意味着在查询User实体时也会把orders的值查出来赋给User实体。
当然也可以通过取消懒加载来解决。