Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate在运行时加载_Java_Hibernate_Eager Loading - Fatal编程技术网

Java Hibernate在运行时加载

Java Hibernate在运行时加载,java,hibernate,eager-loading,Java,Hibernate,Eager Loading,我已经实现了JavaWeb应用程序(核心应用程序),它能够将模块插入核心应用程序。我得到org.hibernate.LazyInitializationException 无法初始化代理-在反射的帮助下尝试迭代java对象的属性时,没有会话异常 我发现,我可以通过为hibernate映射文件启用lazy=“false”属性来解决这个问题。但我不想这样做,因为hibernate映射文件在我的核心代码中 我尝试了这个解决方案,但也没用。我也犯了同样的错误 在运行时是否有其他方法解决此问题?感谢您的宝

我已经实现了JavaWeb应用程序(核心应用程序),它能够将模块插入核心应用程序。我得到
org.hibernate.LazyInitializationException
无法初始化代理-在反射的帮助下尝试迭代java对象的属性时,没有会话
异常

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

我尝试了这个解决方案,但也没用。我也犯了同样的错误


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

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

您需要实现众所周知的
OpenSessionInView
模式

它是通过使用Sevlet
过滤器实现的,如何配置它取决于您是否在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>

当您试图访问未绑定到hibernate当前会话的对象时,会出现此错误

您可以像这样加载惰性初始化数据:

Hibernate.initialize(YOUR_OBJECT.GETTER_METHOD_OF_YOUR_LAZY_LOADDED_ATTRIBUTE)

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

您正在事务外部使用该对象

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


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

您是直接使用Hibernate还是通过JPA使用Hibernate?我直接使用Hibernate进行xml配置,您的web应用程序是否使用Struts或Spring之类的框架?很抱歉,缺少调查解决方案的信息。我正在使用Spring框架。我已经发布了我的解决方案,涵盖了Spring的情况。是的,我没有在事务中使用此对象。这就是原因吗?如果是的话,你知道我应该如何解决这个问题吗?
Hibernate.initialize(YOUR_OBJECT.GETTER_METHOD_OF_YOUR_LAZY_LOADDED_ATTRIBUTE)