先来看一个例子:
static User getUser(int id){
User user=null;
Session session=null;
try{
session=HibernateUtil.getSession();
user=(User)session.get(User.class, id);
}catch(HibernateException e){
throw e;
}finally{
if(session!=null){
if(session.isOpen()){
session.close();
}
}
}
return user;
}
class Test{
public static void main(String arg[]){
int id=2;
User user=Test.getUser(id);
System.out.print(user.getName());
}
}
执行该类不会出现异常能正确显示用户名.
static User loadUser(int id){
User user=null;
Session session=null;
try{
session=HibernateUtil.getSession();
user=(User)session.load(User.class, id);
}catch(HibernateException e){
throw e;
}finally{
if(session!=null){
if(session.isOpen()){
session.close();
}
}
}
return user;
}
class Test{
public static void main(String arg[]){
int id=2;
User user=Test.loadUser(id);
System.out.print(user.getName());
}
}
执行该方法会出现异常,报初始化异常,这是因为load()方法是用了延迟加载策略,在没有使用该对象的方法或属性之前它返回的是继承该查询对象的代理类,当真的使用到该类的实行或方法时才会发出select语句去数据库中查询数据,这里我们在loadUser()方法中没有使用该对象的属性或方法所以这里返回的是一个代理类,并且在返回代理类后我们关闭了session这个对象当我们使用该对象的属性时发出查询语句时由于session 已经关闭,所以发出异常信息,只要我们把 System.out.print(user.getName());这个语句放到loaduser方法中就可以顺利执行.