SSH问题

methc 2008-06-05 11:29:08
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.


执行这个方法得时候 出错了getHibernateTemplate().save(agentLog);


配置文件
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>

会不会是oracle数据库得问题呢?
...全文
4032 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ericans 2012-06-20
  • 打赏
  • 举报
回复
是的,刚开始还以为只要DAO接口里面的方法名对应了就好了,最后才知道,所有的action、service、接口实现类里的方法名都要对应
Ericans 2012-06-20
  • 打赏
  • 举报
回复
是的,刚开始还以为只要DAO接口里面的方法名对应了就好了,最后才知道,所有的action、service、接口实现类里的方法名都要对应
c517170131 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 methc 的回复:]

问题解决啦!
我的方法名为:agentLogSave(AgentLog agentLog) 不是save*
改成 saveAgentLog(AgentLog agentLog)就没问题了!
[/Quote]
谢谢 我的也是这问题
janwin 2010-11-24
  • 打赏
  • 举报
回复
好像还是不行啊
hq_love_love 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 methc 的回复:]
问题解决啦!
我的方法名为:agentLogSave(AgentLog agentLog) 不是save*
改成 saveAgentLog(AgentLog agentLog)就没问题了!
[/Quote]
谢谢你,照你的方法,我解决问题了解..
methc 2008-06-06
  • 打赏
  • 举报
回复
问题解决啦!
我的方法名为:agentLogSave(AgentLog agentLog) 不是save*
改成 saveAgentLog(AgentLog agentLog)就没问题了!
methc 2008-06-06
  • 打赏
  • 举报
回复
com.union.flow.agent.dao.impl.AgentLogDaoImpl这里出了问题啊,他们公用一个parent

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.query.substitutions">true '1', false '0'</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.c3p0.max_size">30</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.timeout">120</prop>
<prop key="hibernate.c3p0.max_statements">100</prop>
<prop key="hibernate.c3p0.idle_test_period">120</prop>
<prop key="hibernate.c3p0.acquire_increment">2</prop>

<!-- Create/update the database tables automatically when the JVM starts up
<prop key="hibernate.hbm2ddl.auto">update</prop> -->
<!-- Turn batching off for better error messages under PostgreSQL
<prop key="hibernate.jdbc.batch_size">0</prop> -->
</props>
</property>
<property name="mappingLocations">
<list>
<value>classpath*:com/union/flow/**/*.hbm.xml</value>
</list>
</property>
</bean>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property></bean>
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property></bean>
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
M_song 2008-06-06
  • 打赏
  • 举报
回复
没有找到问题,2楼能说清楚一些么,都执行到了com.union.flow.agent.dao.impl.AgentDaoImpl里面的getHibernateTemplate().save(agentLog); 这个方法了!

到底是在com.union.flow.agent.dao.impl.AgentDaoImpl出的问题,还是在com.union.flow.agent.dao.impl.AgentLogDaoImpl这里出的问题?
哪有问题就在哪parent事务定义bean试试!
methc 2008-06-06
  • 打赏
  • 举报
回复
你这个东西我在网上看过了,
<bean id="agentDaoTarget"
class="com.union.flow.agent.dao.impl.AgentDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
你看这里面的com.union.flow.agent.dao.impl.AgentDaoImpl里面的方法我运行什么都没有问题
<bean id="agentLogDaoTarget"
class="com.union.flow.agent.dao.impl.AgentLogDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
这里面的com.union.flow.agent.dao.impl.AgentLogDaoImpl的方法就出问题,奇怪啊!!!
M_song 2008-06-06
  • 打赏
  • 举报
回复
<bean id="agentDaoTarget"
class="com.union.flow.agent.dao.impl.AgentDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

你这个都没加事务的!
M_song 2008-06-06
  • 打赏
  • 举报
回复
解决办法:采用spring的事务声明,使方法受transaction控制
改成这样试试:
  <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="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 id="userService" parent="baseTransaction">
<property name="target">
<bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
</property>
</bean>
M_song 2008-06-06
  • 打赏
  • 举报
回复
错误原因:
OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再接除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
methc 2008-06-06
  • 打赏
  • 举报
回复
<!--dao-->

<bean id="agentDaoTarget"
class="com.union.flow.agent.dao.impl.AgentDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="agentDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.union.flow.agent.dao.IAgentDao</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
<value>agentDaoTarget</value>
</list>
</property>
</bean>

<bean id="agentLogDaoTarget"
class="com.union.flow.agent.dao.impl.AgentLogDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="agentLogDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.union.flow.agent.dao.IAgentLogDao</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
<value>agentLogDaoTarget</value>
</list>
</property>
</bean>
<!--service-->
<bean id="agentServiceTarget" class="com.union.flow.agent.service.impl.AgentServiceImpl"
singleton="true" >
<property name="agentDao">
<ref bean="agentDao" />
</property>
<property name="agentLogDao">
<ref bean="agentLogDao" />
</property>
</bean>

<bean id="agentService" parent="txProxyTemplate">
<property name="target">
<ref local="agentServiceTarget" />
</property>
</bean>

</beans>

没有找到问题,2楼能说清楚一些么,都执行到了com.union.flow.agent.dao.impl.AgentDaoImpl里面的getHibernateTemplate().save(agentLog); 这个方法了!
M_song 2008-06-06
  • 打赏
  • 举报
回复
请查看你的AOP的相关配置文件!
M_song 2008-06-06
  • 打赏
  • 举报
回复
<!-- 配置那些类的方法进行事务管理 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution (* com.test.manager.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>

(expression)路径出的错

出你那个异常是由于expression对应的路径有问题,请仔细查看,是否为你的程序的包路径!
laorer 2008-06-05
  • 打赏
  • 举报
回复
Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

改成 FlushMode.COMMIT/AUTO


http://topic.csdn.net/u/20080402/13/4989509e-9aab-4f0c-8332-2a268bb0df1f.html

67,517

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧