Hibernate在运行时急切加载

时间:2013-09-16 06:16:43

标签: java hibernate eager-loading

我已经实现了java Web应用程序(核心应用程序),它可以将模块插入核心应用程序。我试图在反射的帮助下迭代java对象的属性时遇到org.hibernate.LazyInitializationException could not initialize proxy - no Session异常。

我发现,我可以通过为hibernate映射文件启用带有lazy="false"属性的预先加载来解决这个问题。但我不想那样做,因为hibernate映射文件在我的核心代码中。

我尝试了this中的解决方案,但它也没有帮助我。我得到了同样的错误。

是否有其他方法可以在运行时解决此问题?欣赏你宝贵的想法。

4 个答案:

答案 0 :(得分:0)

我认为您可能正在尝试在事务外调用对象方法。要延迟加载对象,应该在事务中插入代理上的调用。

答案 1 :(得分:0)

您需要实现通常所说的OpenSessionInView模式。

它是通过使用Sevlet Filter来实现的,你如何配置它取决于你是否在你的web层中使用像Spring这样的其他框架。

典型的实现使用了Spring OpenSessionInViewFilter之类的

<filter>
    <filter-name>SpringOpenSessionInViewFilter</filter-name>
    <filter-class>
       org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>SpringOpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

必须先在Filter中配置的任何其他web.xml之前完成此操作。如果您使用Spring为您构建会话工厂,则需要使用

配置Filter
<init-param>
    <param-name>sessionFactoryBeanName</param-name>
    <param-value>sessionFactory</param-value>         
</init-param> 

答案 2 :(得分:0)

当您尝试访问未绑定到当前休眠会话的对象时,会出现此错误。

您可以加载延迟初始化数据,如下所示:

Hibernate.initialize(YOUR_OBJECT.GETTER_METHOD_OF_YOUR_LAZY_LOADDED_ATTRIBUTE)

您可以在交易关闭前初始化它。

答案 3 :(得分:0)

您正在使用交易外的对象。

当然,正如Naresh建议的那样,在使用Hibernate.initialize(lazyObject)在事务外使用对象之前,可以强制获取延迟字段,它应该可以工作。使用本机查询,HQL,Hibernate Worker在事务外访问之前获取所有需要的字段也应该工作,并且可能是比使用Hibernate.initialize()更好的解决方案:您可以为数据库编写更好的查询(更好的性能)

OpenSessionInView使您可以从视图中访问会话:访问启用了延迟加载的惰性字段将适用于此解决方案。但是,您应该考虑从视图中启用会话访问的所有效果,有些人认为这是一种不好的做法,因为您应该在视图中操作它们之前知道需要哪些字段:启动查询不是您的视图角色。但它仍然是一个很好的“解决方法”:根据您的需求谨慎选择。