最近自己的项目。发现做修改操作时,项目没有报错,但是数据库数据没有修改,结果发现是自己马虎问题导致的。整合一下网络上查来的各种解决方法:
session获取方式为:sessionFactory.getCurrentSession()
1、可以创建,不能更新、删除。需要手动flush
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
service中update方法被设置为read-only为true,导致:只读不可修改。解决:删除read-only属性。
2、创建操作不执行(可能原因)
appilicationContex.xml配置
<!-- 配置扫描注解,不扫描@Controller注解 -->
<context:component-scan base-package="xyz.chanjkf">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
spring_mvc.xml配置
<!-- 扫描@Controller注解 -->
<context:component-scan base-package="xyz.chanjkf.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
applicationContext.xml不扫描@Controller注解,在spring_mvc中只扫描@Controller注解。(防止spring_mvc扫描@Service导致事务失效)
3、最后贴一下applicationContext.xml和spring_mvc.xml代码
applicationContext.xml
<!-- 配置扫描注解,不扫描@Controller注解 -->
<context:component-scan base-package="xyz.chanjkf">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 添加mysql.properties -->
<context:property-placeholder location="classpath:mysql.properties" ignore-unresolvable="true"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<!-- 可以加多个包 -->
<value>xyz.chanjkf.entity</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.connection.isolation">${hibernate.connection.isolation}</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg>
<bean class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="${hibernate.master.connection.driverClass}"/>
<property name="jdbcUrl" value="${hibernate.master.connection.url}"/>
<property name="username" value="${hibernate.master.connection.username}"/>
<property name="password" value="${hibernate.master.connection.password}"/>
<property name="readOnly" value="false" />
<property name="connectionTimeout" value="${jdbc.connectionTimeout}"/>
<property name="idleTimeout" value="${jdbc.idleTimeout}"/>
<property name="maxLifetime" value="${jdbc.maxLifetime}"/>
<property name="maximumPoolSize" value="${jdbc.maximumPoolSize}"/>
</bean>
</constructor-arg>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置Hibernate事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 单数据源事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="create*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:aspectj-autoproxy proxy-target-class="true" />
<aop:config expose-proxy="true">
<aop:pointcut id="allManagerMethod" expression="execution(* xyz.chanjkf.service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>
<!-- 配置事务异常封装 -->
<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
在项目中遇到Hibernate事务无法自动提交的问题,表现为数据修改操作未生效。问题可能包括:sessionFactory.getCurrentSession()方式下需手动flush,服务层update方法被误设为只读,以及Spring MVC配置导致事务失效。解决方法包括移除read-only属性,调整Spring MVC扫描范围等。
7036

被折叠的 条评论
为什么被折叠?



