我是hibernate的新手,我遇到了这个问题。
如果我这样做:
Session sesion = HibernateUtil.getSessionFactory().openSession();
Transaction tx = sesion.beginTransaction();
A obj = (A) session.load(A.class,id);
System.out.println(obj);
tx.commit();
session.close();
return obj;
没有问题,gui显示对象的数据。
但如果我这样做:
Session sesion = HibernateUtil.getSessionFactory().openSession();
Transaction tx = sesion.beginTransaction();
A obj = (A) session.load(A.class,id);
// i don't use System.out.println(obj);
tx.commit();
session.close();
return obj;
gui没有显示任何内容,我得到以下例外。
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
我一直在阅读api,但这对我来说是一个全新的世界。 有谁知道发生了什么事?
答案 0 :(得分:2)
您需要使用session.load(..)
session.get(..)
A obj = (A) session.get(A.class,id);
session.load(..)
延迟使用代理加载对象,因此如果未访问对象(在您的示例中使用System.out.println
),则对象保持未初始化状态。当在hibernate会话外部访问未初始化的对象(称为分离对象)时,会生成LazyInitializationException
- 因为代理对象无法从休眠会话中检索对象的属性。
session.get(..)
不会延迟加载对象,因此仍然可以在会话外访问它。 get
与load
的其他细微差别很少,因此,我强烈建议您访问以下帖子,了解其差异:
了解获取与加载:http://razshahriar.com/2009/01/hibernate-load-vs-get-differences/
答案 1 :(得分:0)
load方法使用延迟加载来加载其依赖(子)对象。如果您没有在会话中读取对象,它将抛出LazyInitializationException。
使用Hibernate.initialize(object)初始化所有子对象,以便您可以在没有会话的情况下使用它。