2011-09-18 68 views
3

我在我的项目中使用Java和Hibernate。我面临一个非常奇怪的问题。每当我加载一个实体时,选择不在数据库上触发,而是每当我对对象执行一些操作时,比如获取某个值,那时它就会触发选择,这称为延迟加载。但问题是我没有在我的HBM文件中声明lazy="true"。有时候,加载是成功的,然后当我尝试对对象进行一些操作时,它会给出错误,ProxyInitializationError Session is Closed休眠对象加载失败

可以检查下面的链接代码库: - http://pastebin.com/yD9ZM3yH

但是,如果在实际的方法,我把System.out.println(information.getStudentName());然后代码工作正常的会话关闭之前选择被激发。

Regards

回答

3

这是正常的行为。

当您使用session.load(Object.class, id)返回的对象是代理类。 只要看看这里我的答案:

What does Hibernate's load() method do for non-existing IDs?

2)您收到此错误,因为当你收到你的代理尽快,Hibernate Session被关闭,代理开始抛出该异常。

你可以在这篇技术文章中阅读更多关于它和可能的解决方案。

http://community.jboss.org/wiki/OpenSessionInView

希望它能帮助。

+0

+1:另外,请注意,Hibernate 3默认启用了懒惰。您不必指定它。 –

1

有session.load和session.get之间的差异

有关详细信息,请参阅本https://forum.hibernate.org/viewtopic.php?p=2387456

要注意的另一件事是你的交易界限。这就是为什么加入

System.out.println(information.getStudentName()); 

工作。它发生在会议结束之前,因此代理人能够初始化该字段。

LAZY与EAGER的负载效应何时以及如何加载相关实体(Collections或OneToOne),而不是如何加载实体的简单属性。