hibernate--get load延迟加载的问题

本文深入解析Hibernate框架中get和load方法的使用区别,包括直接获取数据库对象、加载代理对象以及对象属性获取时的行为差异,并讨论了在DAO层返回代理对象时可能引发的Nosession异常的解决方案。

一 get load区别

1 User u=(User)session.get(User.class,id)方式 会直接获取数据库对象 没有什么代理  直接打印SQL语句  

User u=(User)session.load(User.class,id)方式 会获得一个代理对象 其中这个代理对象有一个ID属性 其他属性并没有 在调用其他属性时候 才会全部加载 从数据库查询 发出SQL

 User u=(User)load(User.class,101);//101在数据库中不存在
  u.getId()此处由于ID已经存在不会抛出异常

2

get方式加载 若数据库没有  则会返回Null

u.getName()会抛出空指针异常

load方式 如果数据库中也没有  返回的是一个代理对象并不是Null  次代理对象getId()是可以的  但是获取其他属性就会出现问题 抛出ObjectNotFoundException


3重要

我们在Dao层写一个加载对象的load方法,返回一个加载的对象  在次方法里面打开session 并在加载对象之后 关闭session(用finally)

在此方法中 如果调用load方法并返回代理对象(没有get属性)  那么在上层service 或则view层调用对象get属性之后会出现No session的异常 这是因为我们在dao层 返回了一个代理对象之后 关闭了session  那么在上层view 调用对象属性getXXX就会去数据库查询  但此时session已经关闭 因此没有session  

解决方法:1 在Dao中使用get方法代替load方法 dao中直接返回完整的对象 但性能受影响

    2 通过threaLocal把session放在表示层 session在表示层打开 使用完DAO后  在表示层关闭 (未实践) spring 有个opensession in view的模式就是采用这种方法



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值