在hibernate中获取每个具体对象可以使用get或者load来获取,但这两者获取有很大的差别哦!
1.get方式获取对象
使用该方式获取对象时是直接使用sql语句从数据库获取数据赋值到一个对象上!
使用方法如下:
Configuration cfg = new Configuration(); SessionFactory sf = cfg.configure().buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); Student s = (Student) session.get(Student.class, 3); //在session没有关闭时可以获取到该对象的属性 System.out.println(s.getAge()); tx.commit(); session.close(); sf.close(); //在session关闭后仍能获取到该对象属性 System.out.println(s.getAge());
运行结果如下:
Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, student0_.age as age0_0_ from student student0_ where student0_.id=?
1
1
说明在采用get方式是调用get方法后立即产生sql语句查询数据.这样在session关闭后该对象属性也已经获取到。可与load对比.
2.load方式获取对象
采用此方式时如在session已关闭的但关闭之前为获取过该对象属性,那么该对象实际上不存在。
如下:
Configuration cfg = new Configuration(); SessionFactory sf = cfg.configure().buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); Student s = (Student) session.load(Student.class, 3); //在session没有关闭时可以获取到该对象的属性 //System.out.println(s.getAge()); tx.commit(); session.close(); sf.close(); //在session关闭后且之前没有获取过该对象属性将不能获取到该对象属性,产生异常 System.out.println(s.getAge());
运行结果产生异常:因为在session 关闭之前没有获取过该对象属性因此该对象为空,换句话说load方式获取是在session未关闭且获取该对象属性时执行sql获取数据的.
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at ly.suse.model.Student_$$_javassist_1.getAge(Student_$$_javassist_1.java)
at TeacherTest.main(TeacherTest.java:36)
现在我们将注释代码取去掉,将能正常工作:
Configuration cfg = new Configuration(); SessionFactory sf = cfg.configure().buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); Student s = (Student) session.load(Student.class, 3); //在session没有关闭时可以获取到该对象的属性 System.out.println(s.getAge()); tx.commit(); session.close(); sf.close(); //在session关闭后且之前获取过该对象属性能获取到该对象属性 System.out.println(s.getAge());
运行结果如下:
Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, student0_.age as age0_0_ from student student0_ where student0_.id=?
1
1
而且:
Get()和load()是先在缓存中查找对象,如果找不到再去数据库中查询;
Find()是无论何时都在数据库中查询对象。
不知你看明白了没!