system.out之后的hibernate代理对象

时间:2014-08-18 00:40:42

标签: java hibernate

我是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,但这对我来说是一个全新的世界。 有谁知道发生了什么事?

2 个答案:

答案 0 :(得分:2)

您需要使用session.load(..)

,而不是使用session.get(..)
A obj = (A) session.get(A.class,id);

session.load(..)延迟使用代理加载对象,因此如果未访问对象(在您的示例中使用System.out.println),则对象保持未初始化状态。当在hibernate会话外部访问未初始化的对象(称为分离对象)时,会生成LazyInitializationException - 因为代理对象无法从休眠会话中检索对象的属性。

session.get(..)不会延迟加载对象,因此仍然可以在会话外访问它。 getload的其他细微差别很少,因此,我强烈建议您访问以下帖子,了解其差异:

了解获取与加载:http://razshahriar.com/2009/01/hibernate-load-vs-get-differences/

答案 1 :(得分:0)

load方法使用延迟加载来加载其依赖(子)对象。如果您没有在会话中读取对象,它将抛出LazyInitializationException。

使用Hibernate.initialize(object)初始化所有子对象,以便您可以在没有会话的情况下使用它。