博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenSessionInViewFilter配置
阅读量:4882 次
发布时间:2019-06-11

本文共 1960 字,大约阅读时间需要 6 分钟。

最近在配置 Structs, Spring 和Hibernate整合的问题:

开启OpenSessionInViewFilter来阻止延迟加载的错误的时候抛出了这个异常:

    org.springframework.dao.InvalidDataAccessApiUsageException错误

但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL!

如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误:

 
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;

解决办法1:

    直接修改OpenSessionInViewFilter过滤器的配置,配置过滤器的时候配置就是在一般的配置里面加上下面蓝色部分就可以了,直接指定flushMode的配置就OK了:

下面是配置文件:(web.xml)

 
<
filter
>
<
filter-name
>
OpenSessionInViewFilter
</
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
>
<
filter-mapping
>
<
filter-name
>
OpenSessionInViewFilter
</
filter-name
>
<
url-pattern
>
/*
</
url-pattern
>
</
filter-mapping
>

解决方法2:

    就是配置事务的边界,在你方法的执行时配置事务边界!

下面是sessionFactor.xml配置:

 
<!--
事务的配置
-->
<!--
sessionFactory 为自己配置 sessionFactory 的 bean
-->
<
bean
id
="txManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
/>
</
bean
>
<
aop:config
>
<!--
execution(public * *.*.*..*.*(..)) 为自己项目中操作数据库中的方法
-->
<
aop:pointcut
id
="**"
expression
="execution(public * *.*.*..*.*(..))"
/>
<
aop:advisor
pointcut-ref
="**"
advice-ref
="txAdvice"
/>
</
aop:config
>
<
tx:advice
id
="txAdvice"
transaction-manager
="txManager"
>
<
tx:attributes
>
<!--
name 为 方法名
-->
<
tx:method
name
="**"
read-only
="true"
/>
<
tx:method
name
="**"
propagation
="REQUIRED"
/>
</
tx:attributes
>
</
tx:advice
>

下面是总结:

原理:因为配置openSessionInView时,启动后他默认是给没有配置事务边界的方法都默认为只读的,所以在插入数据时就会报上面的错

转载于:https://www.cnblogs.com/clinglin/archive/2011/04/05/2005542.html

你可能感兴趣的文章
java.lang.IllegalStateException: getOutputStream() has already been cal
查看>>
Ubuntu下搜狗输入法乱码
查看>>
计算机网络●通信协议
查看>>
在EditPlus里配置编译和运行java代码的方法
查看>>
gson所需jar包
查看>>
最干净的pyinstaller打包成exe应用程序方法
查看>>
Python中的数据类型
查看>>
讲给普通人听的分布式数据存储【转载】
查看>>
关于最短路
查看>>
Hbase记录-zookeeper部署
查看>>
Python pexpect出现错误‘module have no attribute "spawn" 解决办法
查看>>
vs2008 C# 怎么调试C++ dll[转]
查看>>
PHP的魔术方法
查看>>
警惕麦咖啡的"缓冲区溢出保护"引起的ASP.NET 中 System.OutOfMemoryException 的错误...
查看>>
optimizer_dynamic_sampling
查看>>
HTML(WEB)开发day05
查看>>
序列合并求前K小项 POJ2442
查看>>
unity点选构建Mesh并保存OBJ
查看>>
python kmeans实战 - 单机一层聚类(小玩具哦),下次再弄个分布式多次聚类
查看>>
Java主要有那几种文件类型?各自的作用是什么?
查看>>