【问题标题】:hibernate lazy loading exception in context Spring JSF application上下文Spring JSF应用程序中的休眠延迟加载异常
【发布时间】:2012-10-28 10:38:07
【问题描述】:

我正在开发一个基于 Spring、Hibernate 和 JSF 的 Web 应用程序,并且我遇到了一个之前讨论过多次的已知问题。见下文:

17:42:11,970 错误 [STDERR] 11 月 7 日。 2012 17:42:11 javax.faces.component.UIInput 更新模型 GRAVE:createProjectForm:projectStatus:处理您提交的信息时出错。 17:42:11,972 INFO [STDOUT] 17:42:11 错误 org.hibernate.LazyInitializationException 无法初始化代理 - 没有会话 org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话 在 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) 在 org.hibernate.proxy.pojo.BasicLazyInitializer.invoke(BasicLazyInitializer.java:75) 在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:160) 在 com.company.entity.TLsta_$$_javassist_6.setLStat(TLsta_$$_javassist_6.java) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 javax.el.BeanELResolver.setValue(BeanELResolver.java:108) 在 javax.el.CompositeELResolver.setValue(CompositeELResolver.java:68) 在 com.sun.faces.el.FacesCompositeELResolver.setValue(FacesCompositeELResolver.java:100) 在 org.apache.el.parser.AstValue.setValue(AstValue.java:114) 在 org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249) 在 com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93) 在 javax.faces.component.UIInput.updateModel(UIInput.java:771) 在 javax.faces.component.UIInput.processUpdates(UIInput.java:703) 在 javax.faces.component.UIForm.processUpdates(UIForm.java:261) 在 org.ajax4jsf.component.AjaxViewRoot$2.invokeContextCallback(AjaxViewRoot.java:419) 在 org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:235) 在 org.ajax4jsf.component.AjaxViewRoot.processUpdates(AjaxViewRoot.java:435) 在 com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) 在 com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 在 org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 在 org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 在 org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:394) 在 org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 在 org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67) 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101) 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:10 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareReque 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:278) 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89) 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在 org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在 org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter 在 org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)

我尝试了以下解决方案但没有成功:(:

  • OpenViewInSession 过滤器
  • @Transactional 注释
  • Hibernate.initialize(object)

我认为我的问题与无法获得当前 Hibernate 会话的 JSF 有关,但我不知道如何解决。

我正在使用:

  • JSF 1.2
  • Richfaces 3.3.2
  • 春季 2.5
  • 休眠 3.2.5
  • JBoss 4.2

在下面找到我的配置文件和源代码:

web.xml

<!-- Hibernate filter -->
<filter>
  <filter-name>hibernateFilter</filter-name>
  <filter-class>
      org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  </filter-class>
  <init-param>
      <param-name>sessionFactoryBeanName</param-name>
      <param-value>sessionFactory</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>hibernateFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

<!-- Security --> 
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<!-- jsf listener -->
<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

<!-- spring listener -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-  class>
</listener>
<listener>
    <listener- class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<!-- jsf servlet -->
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

<!-- RichFaces login -->
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

ApplicationContext.xml

<!-- DataSource -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:oracleDS</value>
    </property>
</bean>

<!-- Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
    <property name="mappingLocations" value="classpath:*.hbm.xml" />

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
</bean>

 <!-- Generic DAO -->
<bean id="genericDAO" class="com.company.dao.GenericDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="genericManager" class="com.company.services.GenericManagerImpl">
    <property name="dao" ref="genericDAO"/>
</bean>

<context:component-scan base-package="com.company">
    <context:include-filter type="regex" expression="com.company.beans.projectdirectory.Maintain*"/>
    <context:include-filter type="regex" expression="com.company.beans.projectdirectory.services.ProjectDirectoryManager"/>
    <context:include-filter type="regex" expression="com.company.beans.app.*"/>
</context:component-scan>
<context:annotation-config />

Create.xhtml 可以访问导致错误的属性:

<rich:comboBox value="#{createProjectBean.project.TPsta.PStat}"id="projectStatus" selectFirstOnUpdate="false"  width="145"
required="true" requiredMessage="#{msg.CMP_requiredPrjStatusError}">
<f:selectItems  value="#{createProjectBean.projectStatusOptions}" />
</rich:comboBox>

知道该怎么做吗?

【问题讨论】:

  • 您需要先发布一些配置和代码,我们才能提供帮助。
  • 请在上面我的帖子中找到我的配置文件和源代码

标签: spring hibernate jsf session lazy-initialization


【解决方案1】:

看起来您在“调用应用程序”阶段之前发生的“UpdateModelValuesPhase”中遇到了这个异常。 “调用应用程序”阶段通常是您进行大部分处理的地方。

如果您正在使用 openSessionInView 过滤器并且仍然收到此异常,则可能是您在上一个请求期间加载了代理,但在当前请求期间尝试访问它。由于代理与已关闭的旧会话相关联,因此您会收到 LazyInitialization 异常。

【讨论】:

  • 您的分析似乎合乎逻辑,看起来这是问题所在,但我怎么知道我是否加载了代理?或者你能给我一个解决方案吗?
  • 您可以使用跨越“长时间对话”的扩展休眠会话。通过将休眠会话存储在 Http Session 中,您基本上可以为整个工作流程使用相同的休眠会话。但这可能会导致其他问题,通常最好避免。有关详细信息,请参阅这些链接 - docs.jboss.org/hibernate/orm/3.3/reference/en/html/… community.jboss.org/wiki/…
  • 另一种解决方案是 - 从上一个会话中识别您尝试在当前会话中加载的对象。第一个选项,确保它在上一个会话中完全加载,这样您就不必在当前会话中延迟加载它。第二个选项,在当前请求期间,使用 session.lock(Object) 将对象与当前会话重新关联。
  • 我尝试了解决方案 Hibernate session with long conversion,但总是遇到相同的错误(可能是解决方案的错误实现)。对于提出的第二个解决方案,我不知道将 session.lock(object) 放在哪里,但我认为它不会解决问题,因为当 JSF 尝试 UpdateModel 时触发了错误,因此没有执行 java 类!!!
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 2014-07-11
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2011-06-18
相关资源
最近更新 更多