Reputation: 1
Environment: Spring 4, Hibernate 4, JPA
if call BuilderDao.delete(entity) we get Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. the config setting as follows
if I change transaction manager to org.springframework.orm.hibernate4.HibernateTransactionManager and change sessionFactory to org.springframework.orm.hibernate4.LocalSessionFactoryBean everything is good.
I want to use JPA, how to resolve it?
builder
<bean id="builder" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interceptorNames">
<value>transactionInterceptor,builderAOP</value>
</property>
</bean>
<bean id="builderAOP" class="my.aop.BuilderImp">
<property name="corporateDao" ref="corporateEventDao"/>
</bean>
<bean id="corporateEventDao" class="my.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
transactionInterceptor
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property></bean>
transactionManager
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
wrap sessionFactory
<bean id="sessionFactory" factory-bean="entityManagerFactory" factory-method="getSessionFactory" />
entityManagerFactory
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>xxxx.hbm.xml</value>
</list>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.jdbc.batch_size">1000</prop>
<prop key="hibernate.jdbc.fetch_size">100</prop>
<prop key="use_streams_for_binary">true</prop>
<prop key="hibernate.connection.autoReconnect">true</prop>
</props>
</property>
</bean>
Upvotes: 0
Views: 562
Reputation: 365
can this help you? Supplement Documentation
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="batchSave*" propagation="REQUIRED"/>
<tx:method name="batchDelete*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="list*" propagation="REQUIRED" read-only="true"/>
<tx:method name="query*" propagation="REQUIRED" read-only="true"/>
<tx:method name="page*" propagation="REQUIRED" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
Upvotes: 0