一 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的模式就是采用这种方法