Mybatis和JPA混用因事务管理器错误使用导致JPA的save方法失效

参考博文: spring-data-jpa中save不触发数据库insert语句的问题


这篇博文记录一个错误,当Mybatis 和JPA 混合使用的时候,如果你不小心设置了JDBC 事务管理器,那么Spring Data JPA 的save方法可能因为冲突导致方法失效。

造成的影响就是无论怎么操作,虽然JPA save 对象保存成功了但是就是数据库中找不到插入的记录。

错误示范如下:

<!-- 数据库事务管理 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

修复方案一:

直接注释掉org.springframework.jdbc.datasource.DataSourceTransactionManager bean的定义即可

	<!-- 数据库事务管理 -->
<!--	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
<!--        <property name="dataSource" ref="dataSource"/>-->
<!--    </bean>-->

修复方案二:

当然你也可以注释掉上面那个bean 然后自己添加这个JPA 的事务管理器org.springframework.orm.jpa.JpaTransactionManager

    <!-- 配置Spring Data JPA 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

PS: 但是由于Spring Data JPA 有自动配置功能,因此不设置也可以。


修复之后你会看到save 方法已经奏效可以正常插入数据库了。

本篇完~

Spring Boot是一个基于Spring框架的快速开发脚手架,可以帮助开发者快速搭建一个Spring应用。MyBatisJPA是两个流行的ORM框架,可以帮助开发者将Java对象映射到数据库表。 Spring Boot整合MyBatis使用: 1. 添加MyBatis和MySQL的依赖: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 配置数据源和MyBatis: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # MyBatis Mapper文件的位置 mybatis: mapper-locations: classpath:mapper/*.xml # 实体类的包名 type-aliases-package: com.example.demo.model ``` 3. 编写MyBatis Mapper: ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.demo.mapper.UserMapper"> <select id="getUserById" resultType="com.example.demo.model.User"> select * from user where id = #{id} </select> </mapper> ``` 4. 编写UserMapper接口: ```java @Mapper public interface UserMapper { User getUserById(int id); } ``` 5. 在需要使用的地方注入UserMapper: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(int id) { return userMapper.getUserById(id); } } ``` Spring Boot整合JPA使用: 1. 添加JPA和MySQL的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.5.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 配置数据源和JPA: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver jpa: hibernate: ddl-auto: update properties: # 打印JPA的SQL语句 hibernate: show_sql: true format_sql: true ``` 3. 编写实体类: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String name; private int age; // 省略getter和setter } ``` 4. 编写JpaRepository: ```java @Repository public interface UserRepository extends JpaRepository<User, Integer> { } ``` 5. 在需要使用的地方注入UserRepository: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(int id) { return userRepository.findById(id).orElse(null); } } ``` 总结: Spring Boot整合MyBatisJPA使用方法基本相似,只是依赖和配置略有不同。MyBatis需要编写Mapper和XML文件,JPA需要编写实体类和JpaRepository接口。使用时只需要在需要使用的地方注入Mapper或Repository即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值