Load方法,从数据库里取数据,并封装成JAVA对象。
示例:
Get方法,与Load方法的效果一样。
Get与Load的区别在于:
1.当session关闭后,使用Get方法从数据库得到的对象仍能查看和使用;
原理:当我们用session的get方法去拿对象的时候,它马上会发出sql语句,然后从数据库取出值装到这个对象里面去。
2.session关闭后,使用Load方法取出的对象就会报错了,报错的内容为org.hibernate.LazyInitializationException。LazyInitializationException就是延迟初始化异常,错误内容是could not initialize proxy - no Session。
原因是:用Load去拿对象的时候,load拿到的是一个代理,这个代理并没有真正的发出sql语句,当你要获取这个对象的某个内容的时候,才执行sql语句。这整个过程都需要session的存在来帮它发出sql语句得到想要的内容。
有意思的地方:你用一个不存在的主键去获取一个对象,用load不会报错,但是用get会报错,原因就在于,get会立即发出sql语句,发现没有这个id的数据,而load只是拿到这个数据的代理,并没有真正的去发出sql语句,等到你去使用或查看你取出的对象的内容的时候才会发出sql语句,这个时候就会报错了。
测试:
session关闭后,输出teacher的getClass()方法的值。
用get得到:class cn.edu.hpu.model.Teacher
用load得到:class cn.edu.hpu.model.Teacher_$$_javassist_1
示例:
public void testLoad(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); session.beginTransaction(); //形参1:class-将取出的数据当做什么对象来存取 //形参2:serializable-主键 //从数据库中取出主键为1(这里是id为1)的数据,并封装成一个JAVA对象 Teacher teacher=(Teacher)session.load(Teacher.class, 1); System.out.println(teacher.getName()+" "+teacher.getTitle()); session.getTransaction().commit(); session.close(); sf.close(); }结果:取出了数据库中ID为1的数据,并且将Name和Title打印出来
Get方法,与Load方法的效果一样。
示例:
@Test public void testGet(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); session.beginTransaction(); //形参1:class-将取出的数据当做什么对象来存取 //形参2:serializable-主键 //从数据库中取出主键为1(这里是id为1)的数据,并封装成一个JAVA对象 Teacher teacher=(Teacher)session.get(Teacher.class, 1); System.out.println(teacher.getName()+" "+teacher.getTitle()); session.getTransaction().commit(); session.close(); sf.close(); }结果:取出了数据库中ID为1的数据,并且将Name和Title打印出来
Get与Load的区别在于:
1.当session关闭后,使用Get方法从数据库得到的对象仍能查看和使用;
原理:当我们用session的get方法去拿对象的时候,它马上会发出sql语句,然后从数据库取出值装到这个对象里面去。
2.session关闭后,使用Load方法取出的对象就会报错了,报错的内容为org.hibernate.LazyInitializationException。LazyInitializationException就是延迟初始化异常,错误内容是could not initialize proxy - no Session。
原因是:用Load去拿对象的时候,load拿到的是一个代理,这个代理并没有真正的发出sql语句,当你要获取这个对象的某个内容的时候,才执行sql语句。这整个过程都需要session的存在来帮它发出sql语句得到想要的内容。
有意思的地方:你用一个不存在的主键去获取一个对象,用load不会报错,但是用get会报错,原因就在于,get会立即发出sql语句,发现没有这个id的数据,而load只是拿到这个数据的代理,并没有真正的去发出sql语句,等到你去使用或查看你取出的对象的内容的时候才会发出sql语句,这个时候就会报错了。
测试:
session关闭后,输出teacher的getClass()方法的值。
用get得到:class cn.edu.hpu.model.Teacher
用load得到:class cn.edu.hpu.model.Teacher_$$_javassist_1
class cn.edu.hpu.model.Teacher_$$_javassist_1是class cn.edu.hpu.model.Teacher的子类,是一个代理对象(代理类),重写了父类的方法,检查有么有发出sql语句,没有就发出。javassist是专门生成动态代理的类库,也就是能直接生成二进制码的类库,没有编译等过程。
转载请注明出处:http://blog.csdn.net/acmman