开发者社区> 问答> 正文

关于Spring整合Hibernate的问题

我执行数据库操作的时候一直报出: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.
这个错误。
applicationContext.xml:

<!-- 数据库配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/test" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

<!-- 会话工厂 -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref local="dataSource" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.MySQLDialect
            </prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="show_sql">
                true
            </prop>
            <prop key="hbm2ddl.auto">
                update
            </prop>
            <prop key="current_session_context_class">
                thread
            </prop>
        </props>
    </property>

    <!-- 配置实体描述文件 -->
    <property name="mappingLocations">
        <list>
            <value>classpath:/com/sx/bean/*.hbm.xml</value>
        </list>
    </property>
</bean>

<!-- 配置事务管理器 -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- 配置事务的传播特性 -->
<bean id="baseTransactionProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="save*">PROPAGATION_REQUIRED</prop>
            <prop key="delete*">PROPAGATION_REQUIRED</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="*">readOnly</prop>
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>

UserDao下的save方法:

public boolean save(User user) {
    try
    {
        getHibernateTemplate().save(user);
    } catch (RuntimeException e)
    {
        System.out.println("UserDao >> save >> " + e);
        return false;
    }
    return true;
}

每次调用Dao方法都会报出上述那个错误,求救

展开
收起
蛮大人123 2016-02-22 12:02:38 2501 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 所有find开头的方法为只读,所有查询方法都以find开头 -->
            <tx:method name="find*" read-only="true" />
            <!-- 其余方法如果没有事务的时候,就开启新事务运行该方法,否则使用已有的事务运行该方法 -->
            <!-- 关闭read-only保证save*,update*,delete*等方法可以修改数据 -->
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    
    <!-- 设置com.sx.dao包下及其子包下的类的所有方法都加上txAdvice事务通知切片(主要用于自动实现Hibernate事务的提交回滚等) -->
    <aop:config>
        <aop:pointcut id="DaoPointCut" expression="execution(* com.sx.dao..*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="DaoPointCut"/>
    </aop:config>
    2019-07-17 18:46:33
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多