0

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

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

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

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

4

4 回答 4

0

您需要实现俗称的OpenSessionInView模式。

它是通过使用 Sevlet 实现的Filter,您如何配置它取决于您是否在 Web 层中使用其他框架,例如 Spring。

一个典型的实现使用了 Spring 的OpenSessionInViewFilterlike

<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> 
于 2013-09-16T07:12:28.477 回答
0

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

您可以像这样加载延迟初始化的数据:

Hibernate.initialize(YOUR_OBJECT.GETTER_METHOD_OF_YOUR_LAZY_LOADDED_ATTRIBUTE)

您可以在事务关闭之前对其进行初始化。

于 2013-09-16T07:47:42.580 回答
0

您正在事务之外使用对象。

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

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

于 2013-09-16T09:44:35.873 回答
0

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

于 2013-09-16T06:27:51.460 回答