web.xml原始配置:
<!-- 过滤spring中对于hibernate的session关闭管理 -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
自己写的serviceImpl.java文件中的保存更新方法(我所出现问题的位置是:多行提交的方法),在运行时总报错。如下:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
后来在网上狂搜解决方案,将web.xml文件改为如下:
<!-- 过滤spring中对于hibernate的session关闭管理 -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
上面的异常解决了,但又报出新的异常,如下:
org.hibernate.HibernateException: Illegal attempt to associate a collection
with two open sessions
解决这个问题的办法就是要把singleSession的值改为true
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
我无奈了,这两个错误就好像是相互的,只能解决一个。。。
从网上搜。。还真我出现的这咱情况。。结果如下:
说明一下Open Session in View的作用,就是允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期lazy loading数据。
如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernate session,而是每个数据访问都会产生各自的seesion,等于没有Open Session in View。
OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never
代码:
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.NEVER);
return session;
}
看getSession的方式就知道,把flush mode 设为FlushMode.NEVER,这样就算是commit的时候也不会session flush,
如果想在完成request过程中更新数据的话, 那就需要先把flush model设为FlushMode.AUTO,再在更新完数据后flush.
OpenSessionInView默认的FlushMode为
代码:
FlushMode.NEVER
可以采用在写保存更新删除代码的时候手动更改FlushMode
代码:
this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
session.setFlushMode(FlushMode.AUTO);
session.save(user);
session.flush();
return null;
}
});
但是这样做太繁琐了,第二种方式是采用spring的事务声明
代码:
<bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
代码:
<bean id="userService" parent="baseTransaction">
<property name="target">
<bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
</property>
</bean>
太巧了,我们的框架就采用了这位前辈所说的第二种方案,但是为什么我把配置文件改成他说的样式还是不行呢?
郁闷中惊奇发现,不是我所有的多行提交都出问题,而只是个别的。经过一翻考虑后,确定自己写的方法体没有
问题了,那么就是方法名了,才发现,还真是方法名的问题。
原来自己写的serviceImpl.java文件的方法名要用“load”“save”“add”“update”“remove”这些词开头,这个就好像是通过这个bean-service.xml文件管理方法名一样,超出这个范围了,hibernate自身的作用就发挥不出来了。
由于自己对spring,hibernate的了解不深,暂时先这样理解。
分享到:
相关推荐
- **字符集过滤器**:为了确保请求的编码正确,应在`web.xml`中配置字符集过滤器。 #### 二、Spring2.x与Hibernate3.x的整合 **2.1 Hibernate配置文件** Hibernate的配置文件(`hibernate.cfg.xml`)用于配置...
- `/WEB-INF/applicationContext*.xml`表示在`WEB-INF`目录下所有以`applicationContext`开头的XML文件,这些文件将被Spring容器读取。 ```xml <listener-class>org.springframework.web.context....
在 Spring 2.5 中,需要在 applicationContext.xml 文件中配置 Bean,以便实现依赖注入。例如,在该文件中可以配置数据源、 Hibernate sessionFactory、事务管理器等。 2. Hibernate 配置 在 Hibernate 中,需要...
在`web.xml`中配置Spring监听器以初始化Spring容器,并添加`OpenSessionInViewFilter`以解决懒加载问题: ```xml <listener-class>org.springframework.web.context.ContextLoaderListener <filter-name>...
Spring的配置文件通常位于`WEB-INF`目录下,如`applicationContext.xml`,用于定义bean的实例化和依赖注入。例如,定义一个PetAction bean: ```xml <bean name="/pet" class="com.epet.struts.action.PetAction"> ...
通过在web.xml中配置`OpenSessionInViewFilter`,可以实现持久化层的事务与视图渲染的无缝结合,提高应用性能。 ##### 2. **Struts-config.xml与Spring集成** 当Spring与Struts框架集成时,可以通过`...
2. **Struts2配置Spring插件**:在`struts.xml`中配置Spring插件,并通过该插件实现Struts2与Spring之间的集成。 3. **Action类注入Service层**:在Struts2的Action类中,通过Spring的依赖注入机制注入Service层接口...
- `contextConfigLocation` 指定了 Spring 配置文件的位置,本例中为 `classpath:applicationContext.xml`,表示 Spring 配置文件位于类路径下的 `applicationContext.xml` 文件中。 - `ContextLoaderListener` ...
为了实现事务的一致性,通常会在`web.xml`中配置一个过滤器,用以开启Session的生命周期与HTTP请求的生命周期相匹配,即`OpenSessionInViewFilter`: ```xml <filter-name>hibernateOpenSessionInViewFilter ...
然后在`web.xml`中配置Spring的上下文监听器`ContextLoaderListener`,这样Spring会读取配置文件(如`applicationContext.xml`),初始化并管理Bean。配置如下: ```xml <param-name>contextConfigLocation ...
在软件开发中,SSH(Struts2、Spring、Hibernate)是一种常见的Java Web应用框架组合,用于构建高效、模块化的应用程序。SSH配置模板是开发者为了快速搭建项目结构和配置而创建的一种标准化文件,其中包含了这三大...
通过本教程,您将了解关键配置文件的作用及其配置细节,包括`web.xml`、`applicationContext.xml`、`spring-mvc.xml`和`applicationContext-shiro.xml`。 #### 1. web.xml配置详解 `web.xml`文件是Web应用程序的...
- 在`applicationContext.xml`中配置SessionFactory和dataSource,以便Spring管理数据库连接。 2. **创建POJO和映射文件**: - 使用MyEclipse或其他IDE的向导,自动生成实体类(POJO)及其对应的Hibernate映射...
在 `web.xml` 中添加一个 `context-param`,指定 Spring 配置文件的位置,例如 `applicationContext.xml`。然后,定义一个 `ContextLoaderListener` 监听器,它会在 Web 应用启动时加载配置文件并将其绑定到 ...
- 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤,我们不仅可以让Spring有效地管理Struts,实现更灵活的业务逻辑控制,还可以利用Spring的强大功能管理...
通常情况下,开发者会在`web.xml`中配置此监听器以及应用程序上下文的位置。 - **配置示例**: ```xml <!-- Spring WebApplicationContext 初始化 --> <listener-class>org.springframework.web.context....
在集成Struts、Hibernate和Spring时,主要涉及以下三个关键配置文件:`web.xml`、`struts-config.xml`以及Spring的配置文件(如`applicationContext.xml`)。这些配置文件共同协作,确保框架间能无缝通信和数据处理...
这包括但不限于`web.xml`、`struts-config.xml`、`hibernate.cfg.xml`以及Spring的配置文件等。这些文件定义了框架如何工作以及组件间的交互方式。 #### 三、具体配置步骤 以下是一些具体的配置步骤示例: **1. ...
`<context-param>`和`<listener>`元素在`web.xml`中配置Spring的上下文加载。 4. **Tiles**:Tiles是Struts2的一个插件,用于创建和管理复杂的页面布局。它允许将页面拆分为多个组件,每个组件可以独立设计和重用。...
在`web.xml`中,通过`ContextLoaderListener`来加载Spring的配置文件,从而初始化Spring容器。这里的关键配置包括: ```xml <!--Spring--> <listener-class>org.springframework.web.context....