当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate、Spring和Struts 2在视图模式中打开会话

邹山
2023-03-14

我正在做一个项目,使用Hibernate进行持久化,使用Struts 2进行视图模式。

我的配置文件是:

web.xml

<?xml version="1.0" encoding="UTF-8"?>

 <web-app>
     //......
     //.....
     <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
      </filter>
      <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      
      <!-- The defintion of the root Spring Container shared by all Servlets and Filters -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <!-- Creates the spring Container shared by all servlet and filters -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      
       <filter> <!-- Get spring to keep the session open for the whole request, so hibernate's lazy loads work -->
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern> 
      </filter-mapping>
    </web-app>

< code > application context . XML :

<?xml version="1.0" encoding="UTF-8"?>
<beans >
//.......
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/DB_TEST"></property>
        <property name="username" value="root"></property>
        <property name="password" value=""></property>
    </bean>
    
    <bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocations">
            <list>
                <value>classpath*:META-INF/persistence.xml</value>
            </list>
        </property>
        <property name="defaultDataSource" ref="dataSource"></property>
    </bean>
    
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitManager" ref="persistenceUnitManager"></property>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    <context:annotation-config></context:annotation-config>
</beans>

我的问题是,在Struts 2的视图模式中,我无法保持Hibernate会话打开,这意味着当我尝试加载一些尚未用Hibernate初始化的数据(例如集合)时,我会得到<code>org.Hibernate。LazyInitializationException,所以在做了一些研究之后,我发现我必须在<code>web中添加这个范围。xml,以在视图模式中保持会话打开。

范围:

<filter> <!-- Get spring to keep the session open for the whole request, so hibernate's lazy loads work -->
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern> 
  </filter-mapping>

但是即使这样我还是有同样的问题,所以谁能告诉我我哪里做错了。

共有2个答案

沃楷
2023-03-14

我以前也遇到过类似的问题,为了解决这个问题,我使用了hibernate . enable _ lazy _ load _ no _ trans属性,而不是OpenSessionInView模式。关于LazyInitializationException的更多信息可以在这里或这里找到

有耀
2023-03-14

滤波器链的顺序很重要。在您的情况下,会话应该在struts执行动作之前打开,之后关闭。最后一件事由spring通过管理Hibernate会话来完成。因此,重新排序过滤器,并允许struts2 dispatcher接受来自第一个过滤器的请求。

   <filter> <!-- Get spring to keep the session open for the whole request, so hibernate's lazy loads work -->
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern> 
  </filter-mapping>

 <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>
 类似资料:
  • 我使用CXF Servlet公开了一些REST服务。然而,我遇到了这样的问题:一个类需要一个延迟加载的集合(不止一个列表)。我得到了这个: 我的cxf配置相当简单: 如何实现“在视图中打开会话”模式,以便在 Jackson 序列化对象时我的Hibernate会话可用?

  • 问题内容: 考虑到我选择的JPA(Hibernate实现),Spring和<在此处插入MVC框架-Struts 1,Struts 2,Spring MVC,Stripes …>的开发框架,我要问这个问题。 我一直在思考我的实体层中的关系- 例如,我有一个包含许多订单行的订单实体。我已经设置好我的应用程序,以便它热切地加载每个订单的订单行。您是否认为这是解决如果将获取策略设置为false会遇到的惰性

  • 下面是Spring3.x和Hibernate3.x上的一个假设情况 我在Spring有一个服务层,它调用3个DAO来构建一个模型。DAO 是事务性的(@Transactional),并且具有延迟加载的Hibernate集合。 该服务方法会导致一些更新,以及数据的获取。 典型的DAO方法如下- 我有以下关于OSIV的问题 - 1.在默认的AUTO模式下,此会话刷新(数据库更新)多少次? 2.是否可以

  • 我正在创建一个新项目,我对Spring冬眠管理有一些疑问。首先,我想说的是,我已经读了很多书,我试图记录自己,但几周后,我仍然对这个话题有点迷茫。 项目配置 > 我的架构遵循以下结构: JSF豆- 我的hibernate处理所有Dao,并与Spring完全集成。 一切似乎都集成得很好,但我仍然找不到一个可靠的解决方案来管理Hibernate会话。 我的第一种方法是使用JSF PhaseListen

  • 但这不起作用,当我进入“loginriuscito.jsp”时,我只看到“welcome:”

  • 主要内容:启用Struts2开发模式,禁用Struts 2的开发模式,参考在Struts2开发中,这应该是第一个学习配置的值。为了启用 Struts 2 的开发模式,可以通过自动配置显著增加Struts2的开发速度和属性文件加载,以及额外的日志和调试功能。 注:自动重新加载功能真的是一个方便的功能。 每次修改属性或XML配置文件更改,应用程序不再需要重启才能生效。 默认情况下,Struts 2的开发模式是禁用的。 启用Struts2开发模式 将“struts.devMo