一、get不支持lazy,load支持lazy。
二、采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常。
三、执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。
四、load()方法可以返回实体的代理类实例,而get()永远只返回实体类.
get的例子:
public void testGetMethod() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//马上发出查询sql,加载User对象
User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2c2ff0002");
System.out.println("user.name=" + user.getName());
user.setName("张三");
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
PS:在执行第8行语句的时候,如果数据库有相关的记录,则立刻发出sql语句,即使是没有第9行中user.getName()方法调用,如果没有匹配的记录则返回来一个null。
load方法例子:
public void testLoadMethod() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载)
//延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句)
//hibernate延迟加载实现原理是代理方式
User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2b2ff0002");
System.out.println("user.name=" + user.getName());
user.setName("李四");
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
PS:在执行到10句代码的时候并没有立刻发出sql语句,由于load实现了lazy延迟加载,延迟加载只有真正使用该对象的时候才进行加载, 发出sql语句,关键是11句代码。如果load方法里面的id在数据库表里面没有相关的,则会发出ObjectNotFoundException 异常。
PS:可以通过设置断点,用debug来跟踪相关变量跟对象的改变,这样就可以很清晰理解load和get这两个方法。
hibernate,session load出来的对象是
持久态:对象于数据库记录建立对应关系并保持同步。对象被绑定在持久化上下文当中,今后它的任何状态变化、数据变更均处于工作单元的管理之下,这就是持久态。session.load在hibernate3.2中提供的默认延迟加载方式,我觉得load出来的是一个代理,也可以说是持久态(自己这么理解的,如有误请个高手纠正)。
来源: <http://blog.csdn.net/ssyan/article/details/6037645>