这是 applicationContext.xml
<!--
*************************************
以下定义的是系统中的数据源,class 属性定义了连接数据源的类的路径
<property> 标签定义的是 hibernate 数据源文件的路径
*************************************
-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>/WEB-INF/classes/hibernate.cfg.xml</value>
</property>
</bean>
<!--
*************************************
以下定义了 Spring 所提供的 hibernate3 的事务管理器,
该事务管理器采用设值注入的方式使用了 sessionFactory 定义的数据源
*************************************
-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<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 class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>UserServiceImpl</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<!--此处增加新的Interceptor -->
</list>
</property>
</bean>
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>
<bean id="UserServiceImpl" class="service.UserServiceImpl" autowire="byName" />
<!--
*************************************
以下 bean 定义了 Spring 的 HibernateTemplate,
当需要在程序中直接对持久化层进行访问时,
可以直接使用 Spring 提供的 HibernateTemplate 类进行操作
*************************************
-->
<bean id="infoMsgsDAO" class="dao.InfoMsgsDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- Ajax -->
<bean name="/ajax" class="struts.action.advinfo.AjaxAction">
<property name="userServiceImpl">
<ref bean="UserServiceImpl"/>
</property>
</bean>
这是 UserServiceImpl 代码
import dao.InfoContextlistDAO;
import dao.InfoFeedbackDAO;
import dao.InfoMsgsDAO;
public class UserServiceImpl implements IUserService {
private InfoContextlistDAO infoContextlistDAO;
private InfoFeedbackDAO infoFeedbackDAO;
private InfoMsgsDAO infoMsgsDAO;
public void setInfoContextlistDAO(InfoContextlistDAO infoContextlistDAO){
this.infoContextlistDAO = infoContextlistDAO;
}
public InfoContextlistDAO getInfoContextlistDAO(){
return this.infoContextlistDAO;
}
public void setInfoFeedbackDAO(InfoFeedbackDAO infoFeedbackDAO){
this.infoFeedbackDAO = infoFeedbackDAO;
}
public InfoFeedbackDAO getInfoFeedbackDAO(){
return this.infoFeedbackDAO;
}
public void setInfoMsgsDAO(InfoMsgsDAO infoMsgsDAO){
this.infoMsgsDAO = infoMsgsDAO;
}
public InfoMsgsDAO getInfoMsgsDAO(){
return this.infoMsgsDAO;
}
}
这是 UserServiceImpl 的接口 IUserService
package service;
import dao.InfoContextlistDAO;
import dao.InfoFeedbackDAO;
import dao.InfoMsgsDAO;
public interface IUserService {
public void setInfoContextlistDAO(InfoContextlistDAO infoContextlistDAO);
public InfoContextlistDAO getInfoContextlistDAO();
public void setInfoFeedbackDAO(InfoFeedbackDAO infoFeedbackDAO);
public InfoFeedbackDAO getInfoFeedbackDAO();
public void setInfoMsgsDAO(InfoMsgsDAO infoMsgsDAO);
public InfoMsgsDAO getInfoMsgsDAO();
}
按道理事务也配置成功了,可是为什么还是报这个错误:
javax.servlet.ServletException: 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
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
filter.MemberLimitFilter.doFilter(MemberLimitFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
分享到:
相关推荐
OpenSessionInViewFilter个人学习总结
OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。在Web应用中,由于HTTP请求的无状态性,一次请求通常由多个Servlet过滤器、控制器和...
面试中,Spring的相关问题经常出现,下面将详细解答这些常见面试题。 首先,Spring的优点包括: 1. 分层架构:Spring允许开发者选择需要的模块,避免了不必要的复杂性。 2. POJO(Plain Old Java Object)编程:它...
3. PlatformTransactionManager:这是Spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类...
- **OpenSessionInView**:解决长时间 HTTP 请求导致的 Hibernate 会话问题,可以使用 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 **5. Spring 事务管理** Spring 提供了两种事务管理方式: - *...
我们可以通过配置XML文件和注解来实现整合,并使用opensessionInviewfilter来解决会话问题。 Spring JDBC面向接口编程 本节讲解了如何使用Spring JDBC来实现面向接口编程。我们可以通过配置XML文件和注解来实现DAO...
在使用Spring框架时,特别是在与Hibernate结合的情况下,可能会遇到“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这样的异常。这个问题通常发生在使用Spring提供的Open Session In ...
当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...
对于OpenSessionInView模式的问题,Spring 提供了OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 7. **事务管理**:Spring 提供了两种事务管理方式:编程式和声明式。编程式事务管理使用...
综上所述,`OpenSessionInViewFilter`作为一种简化Hibernate Session管理和事务处理的方式,在适当的场景下能够极大地提高开发效率和代码质量。但在使用时也需要注意其潜在的性能影响和其他风险,合理选择是否启用该...
- 利用Spring提供的`OpenSessionInView`模式处理事务边界问题,确保每个HTTP请求都运行在一个独立的事务内。 - 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤...
- 利用CharacterEncodingFilter和OpenSessionInViewFilter解决编码问题。 通过以上内容的学习,开发者可以深入理解Spring 2.5的核心概念,掌握其在实际开发中的应用,从而提高工作效率和代码质量。
10. **延迟加载问题**:为了处理Hibernate的延迟加载问题,可以使用Spring的`OpenSessionInViewFilter`。这个过滤器确保在一次HTTP请求的整个生命周期内,Hibernate的Session保持打开状态,允许延迟加载在请求结束时...
- 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在HTTP请求的整个生命周期中都保持数据库会话。 5. **Spring的事务管理**: - Spring提供了...
本文将深入探讨Spring面试中常见的知识点,包括Spring的优点、DI(Dependency Injection)的实现方式、IOC(Inversion of Control)的理解、Spring对ORM框架如Hibernate的支持,以及Spring的事务管理。 首先,...
解决这个问题的方法有两种:一种是在 web.xml 中使用 Spring 提供的 OpenSessionInViewFilter,另一种是在 application.xml 中配置 OpenSessionInViewFilter。前者通用,后者只能用于 SpringMVC 结构中。 最后,...
- **OpenSessionInView**:解决长时间请求导致的事务问题,可通过添加 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 5. **Spring 事务管理** - **TransactionDefinition**:定义事务属性,如隔离...