Thanks for your reply Chaitanya.
I found the problem.  When I defined the transaction attributes for my
method topOff* like this:
<prop key="topOff*">PROPAGATION_REQUIRED</prop>
I was doing the right thing, but...apfuse's default userManager bean is
defined in security.xml as well as applicationContext-service.xml.  I was
just changing the properties in the userManager in
applicationContext-service.xml, so the transaction attributes in securty.xml
were overridding them.  So once I added the above code to the bean in
security.xml, everything worked fine:)

-Zak


The 


nutanc wrote:
> 
> Hi,
> If you look at the transaction attributes,the problem is there.You have:
> ....
> ...
> <props>
>                 <prop
> key="save*">PROPAGATION_REQUIRED,-UserExistsException</prop>
>                 <prop key="remove*">PROPAGATION_REQUIRED</prop>
>                               <prop key="topOff*">PROPAGATION_REQUIRED</prop>
>                 <prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
>             </props>
> ....
> ....
> So any method starting with "save" and "remove" are allowed to update
> whereas all other methods have readonly property.So a very simple solution
> to your problem is to remove the readOnly property in
> 
> <prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
> 
> But obviously that would open up all methods to update and maybe there is
> a security concern.Hope this helps.
> -Chaitanya
> 
> 
> Zakir wrote:
>> 
>> Hello Experts.
>> I am using appfuse, spring, and hibernate to create my project.  I have a
>> userManager, and a userDao for access to my "user" table.  I am trying to
>> run a quartz(1.5.2) cron job to iterate through my user table and edit an
>> integer field (add some amount) for every user record.  The method that I
>> am calling from quartz is located within the userManager.  
>> 
>> the quartz configuration is below:
>> *******************************
>> <bean id="topOffJobDetail"
>> class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
>>              <property name="targetObject" ref ="userManager"/>
>>              <property 
>> name="targetMethod"><value>topOffInvites</value></property>
>> </bean>
>> <bean id="topOffCronTrigger"
>> class="org.springframework.scheduling.quartz.CronTriggerBean">
>>              <property name="jobDetail" ref="topOffJobDetail"/>              
>>              <property name="cronExpression">
>>                      <value>* 30 * * * ?</value>
>>              </property>
>> </bean>
>> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
>>              <property name="triggers">
>>                      <list>
>>                              <ref local="topOffCronTrigger"/>
>>                      </list>
>>              </property>
>> </bean>
>> **************************************************
>> 
>> I have even configured this method in my transaction attributes as
>> follows:
>> <bean id="userManager" parent="txProxyTemplate">
>>         <property name="target">
>>             <bean
>> class="com.ilr.razorpoints.service.impl.UserManagerImpl">
>>                 <property name="userDao" ref="userDao"/>
>>             </bean>
>>         </property>
>>         <!-- Override default transaction attributes b/c of
>> UserExistsException -->
>>         <property name="transactionAttributes">
>>             <props>
>>                 <prop
>> key="save*">PROPAGATION_REQUIRED,-UserExistsException</prop>
>>                 <prop key="remove*">PROPAGATION_REQUIRED</prop>
>>                              <prop key="topOff*">PROPAGATION_REQUIRED</prop>
>>                 <prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
>>             </props>
>>         </property>
>>         <!-- This property is overriden in
>> applicationContext-security.xml to add
>>              method-level role security -->
>>         <property name="preInterceptors">
>>             <list>
>>                 <ref bean="userSecurityInterceptor"/>
>>             </list>
>>         </property>
>>     </bean>
>> 
>> 
>> Everytime the cronjob runs I get this error (everytime it tries to
>> persist a a user after editing it.)
>> 
>> **************************************
>> 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
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1098)
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate$18.doInHibernate(HibernateTemplate.java:692)
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:690)
>>      at
>> com.ilr.razorpoints.dao.hibernate.UserDaoHibernate.saveUser(UserDaoHibernate.java:60)
>>      at
>> com.ilr.razorpoints.service.impl.UserManagerImpl.topOffInvites(UserManagerImpl.java:99)
>>      at sun.reflect.GeneratedMethodAccessor90.invoke(Unknown Source)
>>      at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>      at java.lang.reflect.Method.invoke(Method.java:324)
>>      at
>> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
>>      at
>> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
>>      at
>> org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:80)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
>>      at
>> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
>>      at $Proxy1.topOffInvites(Unknown Source)
>>      at sun.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)
>>      at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>      at java.lang.reflect.Method.invoke(Method.java:324)
>>      at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:248)
>>      at
>> org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:165)
>>      at
>> org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
>>      at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
>>      at
>> org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-3]
>> UserManagerImpl.testQuartz(83) | Quartz is working!!!
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserManagerImpl.topOffInvites(87) | entering top off!
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserManagerImpl.topOffInvites(97) | user mraible now has 6 invites left
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserDaoHibernate.saveUser(57) | user's id: 2
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserManagerImpl.topOffInvites(101) | error in saving user mraible
>> 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
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1098)
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate$18.doInHibernate(HibernateTemplate.java:692)
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
>>      at
>> org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:690)
>>      at
>> com.ilr.razorpoints.dao.hibernate.UserDaoHibernate.saveUser(UserDaoHibernate.java:60)
>>      at
>> com.ilr.razorpoints.service.impl.UserManagerImpl.topOffInvites(UserManagerImpl.java:99)
>>      at sun.reflect.GeneratedMethodAccessor90.invoke(Unknown Source)
>>      at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>      at java.lang.reflect.Method.invoke(Method.java:324)
>>      at
>> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
>>      at
>> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
>>      at
>> org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:80)
>>      at
>> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
>>      at
>> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
>>      at $Proxy1.topOffInvites(Unknown Source)
>>      at sun.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)
>>      at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>      at java.lang.reflect.Method.invoke(Method.java:324)
>>      at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:248)
>>      at
>> org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:165)
>>      at
>> org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
>>      at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
>>      at
>> org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserManagerImpl.topOffInvites(97) | user tomcat now has 6 invites left
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserDaoHibernate.saveUser(57) | user's id: 1
>> [razorpoints] DEBUG [DefaultQuartzScheduler_Worker-7]
>> UserManagerImpl.topOffInvites(101) | error in saving user tomcat
>> *****************************************
>> 
>> I believe there is some kind of transaction issue.  Any help is greatly
>> appreciated.
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Appfuse-Spring-Hibernate-Quartz-InvalidDataAccessApiUsageException-tf2808582s2369.html#a7879442
Sent from the AppFuse - User mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to