Spring Boot中使用EntityManager的实现方法及部署问题咨询
切换Spring Boot从JpaRepository到EntityManager的实操指南
嘿,作为Spring Boot新手想手动用EntityManager操作数据库完全没问题,我来一步步帮你捋清楚配置和使用的关键点,结合你已有的配置来调整:
一、确认依赖是否到位
首先,确保你的pom.xml(Maven)或build.gradle(Gradle)里已经引入了Spring Data JPA的starter,它已经包含了EntityManager所需的所有依赖:
<!-- Maven示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
如果是Gradle,对应的依赖是:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
二、你的现有配置是OK的
你在application.properties里的配置完全符合使用EntityManager的要求,这里帮你格式化得更清晰:
spring.datasource.url=jdbc:mysql://xxxx:3306/my_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=xxx spring.datasource.password=xxx spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.ddl-auto=none
小提示:你原来的
&是XML转义字符,在.properties文件里直接用&可读性会更好,不过Spring Boot也能识别转义后的写法,不影响功能。
三、如何在代码中使用EntityManager
1. 注入EntityManager
在你的Service或自定义Repository类中,用@PersistenceContext注解注入EntityManager(这是JPA规范的注入方式,比@Autowired更贴合JPA的设计):
import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @PersistenceContext private EntityManager entityManager; // 接下来写具体的数据库操作方法 }
2. 编写CRUD操作示例
记得给数据库操作方法加上@Transactional注解,因为EntityManager的增删改操作需要事务支持:
查询单个实体
@Transactional(readOnly = true) public User getUserById(Long id) { return entityManager.find(User.class, id); }
保存/更新实体
@Transactional public User saveOrUpdateUser(User user) { if (user.getId() == null) { entityManager.persist(user); // 新增实体 return user; } else { return entityManager.merge(user); // 更新实体 } }
删除实体
@Transactional public void deleteUser(Long id) { User user = entityManager.find(User.class, id); if (user != null) { entityManager.remove(user); } }
执行JPQL查询
@Transactional(readOnly = true) public List<User> getUsersByAge(int age) { String jpql = "SELECT u FROM User u WHERE u.age = :age"; return entityManager.createQuery(jpql, User.class) .setParameter("age", age) .getResultList(); }
四、部署时可能遇到的常见问题及解决
EntityManager注入失败:
- 检查启动类所在包是否覆盖了你的实体类和业务类(Spring Boot默认会自动扫描启动类同级及子包),如果没有,可以在启动类上添加
@EntityScan指定实体类包路径 - 确保你的实体类上添加了
@Entity注解,并且用@Id标注了主键字段
- 检查启动类所在包是否覆盖了你的实体类和业务类(Spring Boot默认会自动扫描启动类同级及子包),如果没有,可以在启动类上添加
事务相关报错:
- 确认操作方法上添加了
@Transactional注解,也可以在类级别添加该注解统一管理事务 - Spring Boot默认会自动配置JPA事务管理器,无需额外手动配置
- 确认操作方法上添加了
数据库连接报错:
- 核对数据库地址、用户名、密码是否正确,确认数据库服务已正常启动
- 如果使用的是高版本MySQL(8.0+),可以把dialect改成
org.hibernate.dialect.MySQL8Dialect,避免兼容性问题
内容的提问来源于stack exchange,提问作者Java-Dev
相关产品推荐
相关产品推荐

