public void testLoad(){
try {
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();
user = (User)session.load(User.class, 1);
//System.out.println(user.getAddress());
tr.commit();
} catch (HibernateException e) {
tr.rollback();
e.printStackTrace();
}finally{
if(session.isOpen()){
session.close();
}
}
//为什么上面的注释掉,下面的输出就会出错,如果不注释掉,下面就可以正确的输出来了
//如果把上面的load换成get,上面就是注释掉,下面输出也不会出错呢?
System.out.println(user.getAddress());
}
在什么情况下用load呢,如果要用load的话,难道每次都要system.out一下先给他初始化?那也太差劲了啊,而且都推荐用load,不明白应该怎么用,或许用load后不关闭session吗
try {
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();
user = (User)session.load(User.class, 1);
//System.out.println(user.getAddress());
tr.commit();
} catch (HibernateException e) {
tr.rollback();
e.printStackTrace();
}finally{
if(session.isOpen()){
session.close();
}
}
//为什么上面的注释掉,下面的输出就会出错,如果不注释掉,下面就可以正确的输出来了
//如果把上面的load换成get,上面就是注释掉,下面输出也不会出错呢?
System.out.println(user.getAddress());
}
在什么情况下用load呢,如果要用load的话,难道每次都要system.out一下先给他初始化?那也太差劲了啊,而且都推荐用load,不明白应该怎么用,或许用load后不关闭session吗
解决方案 »
- 如何获得线程结束消息
- Exception in thread "main" java.lang.NoSuchMethodError: main
- executeBatch()的问题,急啊!!望高手指教
- 请教 标签与字符串的比较问题
- 怎样将int转变为支持中文的char
- 奇怪的现象
- 怎么让数据库中的内容只能用软件通过ODBC来查询,而不能用查询分析器或企业管理器来查看表结构和内容。
- RESIN中调用数据库产生的错误。
- java swing组件使用过程中出现这样的问题怎么办啊
- 一个JDBC的问题,老是报错找不到驱动?
- 不使用现成DOM等开源jar包,用纯java类解析xml文件,谁能写出来帮个忙,急用!
- 聊天室表情图片
load方法创建时先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库load没找到就抛出异常
get没找到返回null
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
对于load和get方法返回类型:虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是 返回的还是代理对象,只不过已经加载了实体数据。
get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
我再补充一点,load是一种代理模式,比如你这个实例中当要用到user的才会真正加载,当你一直不用use那么他可能一直不会加载。并不是每次都要System.out…… 你user.setAddress("beijing");session.update(user);时照样会加载的。
if(session.isOpen()){
session.close();
}
如果是解析xml文件时出错,无法得到session,这时session为null
Department depart = add();
Employee emp = query(1);
//System.out.println("depart name:"+emp.getDepart().getName()); //出现在这会报错 懒加载1}
static Employee query(int empId){
Session s = null;
Transaction tx =null;
try{
s=HibernateUtil.getSession();
tx = s.beginTransaction();
Employee emp = (Employee)s.get(Employee.class,empId):
System.out.println("depart name:"+emp.getDepart().getName());
//避免懒加载错 Hibernate.initialize(emp.getDepart());//session对象关闭 使用该对象会异常。
tx.commit();
}
疑问 : 在query方法中调用对象属性没问题 session关闭后 在外部调用抛出懒加载异常
get()方法也会懒加载吗????????