使用load获取对象的时候,实质是获得一个指针(类似,可以这么理解),所以使用的时候才会才会调用获取对象。(所以说有延迟)
使用get获取对象的时候,是马上获取对象,如果不存在就拿到空。
参考代码链接: https://pan.baidu.com/s/1b20uBW 密码: 4qq8
@Test public void testLoad(){ Session session = null; try { session = MySessionFactory.openSession(); //load方式加载 /** * 此时不会输出SQL语句,这就是Hibernate的延迟加载 * 在使用时才会输出SQL语句 * employee只是个代理对象,仅仅只有ID * */ Employee employee = (Employee) session.load(Employee.class,1); //没找到会直接报错 // System.out.print(employee); //此时会输出SQL语句 //返回ID,不管有没有 System.out.print(employee.getId()); //执行该条语句时,也不会输出SQL语句,只有一个ID值 }catch (Exception e){ e.printStackTrace(); } } @Test public void testGet() { Session session = null; try { session = MySessionFactory.openSession(); //get /** * 只要是调用了get,就会输出SQL语句,get没有延迟加载 */ Employee employee = (Employee) session.get(Employee.class, 1); //取数据库中找,结果没找到,返回null // System.out.print(employee); //没找到会返回空指针异常 System.out.print(employee.getId()); } catch (Exception e) { e.printStackTrace(); } }
@Override public Employee load(int id) { Employee employee = null; Session session = null; try { /** * 这样会异常 * 原因:load是有延迟的,只是个代理对象,只要id * 要去其他属性值,则要去数据库找,但此时session已经关闭 * 解决方案:可以使用get处理或者将session存储到ThreadLocal中 */ session = MySessionFactory.openSession(); employee = (Employee)session.load(Employee.class,1); }catch (Exception e){ e.printStackTrace(); }finally { MySessionFactory.close(session); } return employee; } }