【问题标题】:hibernate proxy object after system.outsystem.out 后休眠代理对象
【发布时间】:2014-08-18 00:40:41
【问题描述】:

我是休眠新手,我遇到了这个问题。

如果我这样做:

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,但它对我来说是一个全新的世界。 有谁知道怎么回事?

【问题讨论】:

标签: java hibernate


【解决方案1】:

你需要使用session.get(..)而不是session.load(..)

A obj = (A) session.get(A.class,id);

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

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

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

【讨论】:

  • 我想使用 session.get(),我应该将惰性类属性设置为 false 吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2012-06-29
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多