切换至javax后Spring Boot Data JPA中EntityManager注入失败问题
问题:从Jakarta切换至Javax后EntityManager无法注入
项目从Jakarta切换到Javax(因需求必须使用Javax)后,出现EntityManager无法注入的问题,此前使用Jakarta时运行正常。
配置与代码信息
application.yaml
spring: jpa: hibernate: ddl-auto: update datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/stage3_module3 username: postgres password: root
启动类代码
@SpringBootApplication public class NewsManagementApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(NewsManagementApplication.class, args); NewsManagementMenu menu = context.getBean(NewsManagementMenu.class); menu.setScanner(new Scanner(System.in)); menu.runMenu(); } }
Repository代码
import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; import java.util.Optional; @Repository public class NewsRepository implements BaseRepository<NewsModel, Long> { @PersistenceContext private EntityManager entityManager; @Override @SuppressWarnings("unchecked") public List<NewsModel> readAll() { return entityManager.createQuery("select n from NewsModel n").getResultList(); } @Override public Optional<NewsModel> readById(Long id) { return Optional.ofNullable(entityManager.find(NewsModel.class, id)); } @Transactional @Override public NewsModel create(NewsModel entity) { entityManager.persist(entity); return entity; } @Transactional @Override public NewsModel update(NewsModel entity) { Optional<NewsModel> maybeNull = readById(entity.getId()); if (maybeNull.isEmpty()) { return null; } NewsModel toUpdate = maybeNull.get(); toUpdate.setTitle(entity.getTitle()); toUpdate.setContent(entity.getContent()); toUpdate.setLastUpdateDate(entity.getLastUpdateDate()); toUpdate.setAuthor(entity.getAuthor()); toUpdate.setTags(entity.getTags()); return toUpdate; } @Transactional @Override public boolean deleteById(Long id) { return entityManager.createQuery("delete from NewsModel n where n.id=:id") .setParameter("id", id) .executeUpdate() != 0; } @Override public boolean existById(Long id) { return readById(id).isPresent(); } }
依赖配置
dependencies { implementation "org.springframework:spring-context:$springVersion" testImplementation "org.springframework:spring-test:$springVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" testImplementation "com.tngtech.archunit:archunit-junit5:$archUnitVersion" implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.0.2' implementation 'org.postgresql:postgresql:42.5.2' testImplementation 'org.mockito:mockito-core:5.1.1' testImplementation 'org.mockito:mockito-junit-jupiter:5.1.1' implementation 'javax.persistence:persistence-api:1.0' }
报错信息
Cannot invoke "javax.persistence.EntityManager.createQuery(String)" because "this.entityManager" is null
解决方法
- 将
spring-boot-starter-data-jpa版本从3.0.2修改为2.7.7 - 添加依赖:
'javax.xml.bind:jaxb-api:2.3.1'
内容的提问来源于stack exchange,提问作者Grigoriev Egor
相关产品推荐
相关产品推荐

