Hibernate学习之----------get与load的区别

在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()是无论何时都在数据库中查询对象。

不知你看明白了没!

猜你喜欢

转载自youngstream.iteye.com/blog/2080347