2014-10-27 194 views
0

环境:春天4,休眠4,JPA休眠4和JPA集成

如果调用BuilderDao.delete(实体),我们得到线索 异常 “主要” org.springframework.dao.InvalidDataAccessApiUsageException:写操作不允许在只读模式(FlushMode.MANUAL):将您的会话变为FlushMode.COMMIT/AUTO或从交易定义中删除'只读'标记。 的配置如果我改变事务管理org.springframework.orm.hibernate4.HibernateTransactionManager,改变SessionFactory来org.springframework.orm.hibernate4.LocalSessionFactoryBean一切设置如下

好。

我想使用JPA,如何解决它?

建设者

<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> 

包裹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> 

回答

0

能这样帮助你吗?补充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>