Hibernate开发中的异常:could not initialize proxy - no Session

一、异常内容

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实体。

当然也可以通过取消懒加载来解决。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值