在项目中配置OpenSessionInViewFilter后,首先会出现的问题:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
这个是因为OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flushMode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session。
FlushMode.NEVER模式不具备写操作,可以把session配置为FlushMode.AUTO,如在web.xml中配置:
<filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
其次,会遇到的另外一个问题是页面更新操作,因为这个流程是:首先查询取得数据库中的记录,修改客户端改变的属性,更新这个实体类。这是通过以上配置OpenSessionInViewFilter,在session更新实体类之前,session已经存在一个实体类,与客户端传过来的需要修改的实体类会发生冲突,以致更新失败。这个可以通过配置singleSession=false解决。也可以通过重写OpenSessionInViewFilter类的getSession及closeSession方法实现,如:
public class MyOpenSessionInViewFilter extends OpenSessionInViewFilter{
@Override
protected void closeSession(Session session, SessionFactory sessionFactory) {
session.flush();
session.getTransaction().commit();
super.closeSession(session, sessionFactory);
}
@Override
protected Session getSession(SessionFactory sessionFactory)
throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.beginTransaction();
FlushMode flushMode = getFlushMode();
if (flushMode != null) {
this.setFlushMode(FlushMode.AUTO);
}
return session;
}
}
分享到:
相关推荐
在实际项目中,这样的集成方案可以帮助开发团队快速开发出高效、稳定的Java Web应用,但同时也需要注意版本兼容性、性能优化以及安全问题。例如,Struts2框架在后续版本中修复了一些安全漏洞,因此在使用旧版本时需...
在Hibernate框架中,`Session`是执行数据库操作的核心接口,它负责进行持久化操作,如保存、更新或删除实体对象等。为了确保数据的一致性和事务的完整性,Session的生命周期是非常重要的。通常情况下,一个Session...
#### 问题背景 在使用Spring框架时,特别是在与Hibernate结合的情况下,可能会遇到“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这样的异常。这个问题通常发生在使用Spring提供的Open...
例如,如果在请求结束时有写操作(如更新、删除),可能会导致并发控制问题,因为Session在整个请求中保持开放,可能导致脏读或幻读。这时,可能会遇到`InvalidDataAccessApiUsageException`异常,提示写操作不允许...
这是解决在双向关联中防止多表更新问题的一种常见方法。 知识点六:Hibernate的实体和DTO 在内容中提到了ad.setAdProd(adform.getAdProd())等类似的操作,这表明了将表单对象中的数据设置到持久化实体中的过程。这...
在更新或删除数据时,必须调用getHibernateTemplate().flush(); 且在web.xml中添加 <filter>openSessionInViewFilter <filter>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter <param>...
同时,添加`OpenSessionInViewFilter`,以解决多线程环境下Hibernate的Session管理问题。 10. **编写Action类**: - Action类通常对应于一个特定的业务逻辑,例如,AddBean、ListBean等,它们继承自Struts2的...
为了解决这个问题,可以添加`OpenSessionInViewFilter`过滤器,确保在视图渲染期间保持session打开。 5. **分页查询的注意事项** - Hibernate4中,如果你在进行分页查询时遇到“ResultSet may only be accessed in...
- 更新`applicationContext.xml`中的`<property name="mappingResources">`元素,列出所有映射文件的位置。 4. **编写DAO接口和实现**: - 定义数据访问对象(DAO)接口,用于与数据库交互。 - 编写DAO实现类,...
session缓存的作用域可根据配置延长至jsp和action,通过`openSessionInViewFilter`实现;查询缓存用于提高频繁查询的效率,尤其适用于更新较少的场景。 **Java内存管理**分为持久化内存(perm)和非持久化内存。...
在web.xml中配置Spring的监听器ContextLoaderListener以初始化Spring应用上下文,并通过OpenSessionInViewFilter来处理可能出现的SessionFactory问题,确保在Controller和Service之间保持有效的Hibernate Session。...
5. **活跃的社区支持**:Hibernate 是开源的,有活跃的开发者社区,这意味着不断的技术更新和问题解决。 【Hibernate 延迟加载(Lazy Loading)】 延迟加载是一种优化策略,它只在真正需要数据时才加载。例如,...
- **OpenSessionInView**:解决长时间请求导致的事务问题,可通过添加 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 5. **Spring 事务管理** - **TransactionDefinition**:定义事务属性,如隔离...
- 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在HTTP请求的整个生命周期中都保持数据库会话。 5. **Spring的事务管理**: - Spring提供了...
`OpenSessionInViewFilter`过滤器与Hibernate集成,确保每个请求都有一个打开的Session,直到视图渲染完成。 ### 2. Hibernate Hibernate是一个强大的ORM(对象关系映射)框架,用于简化数据库操作,实现对象与...
同时,为了保证页面显示的中文字符正常,需要正确配置OpenSessionInViewFilter和中文编码过滤器。 总的来说,用户菜单管理是一个涉及前端交互、后端逻辑和数据库操作的复杂功能模块。它需要开发者具备扎实的SSH框架...
配置内容包括ContextLoaderListener监听器用于初始化Spring容器,OpenSessionInViewFilter用于管理Hibernate的Session,Struts2的过滤器配置等。 - applicationContext.xml配置:这是Spring的配置文件,用于配置...
-- 使用HQL更新数据库结构 --> <property name="hbm2ddl.auto">update <!-- 设置Hibernate使用的方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect ``` #### Spring配置文件 **表格9*...
// 更新第二级下拉框 }, error: function(xhr, status, error) { console.error("Error:", status, error); } }); }); $("#contentclass").click(function() { // 点击后显示对应的详细内容,可能需要额外的...