Castle
Castle

Reputation: 1

Hibernate 4 and JPA integration

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

Answers (1)

Paris Tao
Paris Tao

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

Related Questions