Spring JPA应用中getObject()引用EntityManagerFactory缺失错误的解决
解决Spring Maven中JpaTransactionManager的EntityManagerFactory缺失问题
问题根源
报错提示EntityManagerFactory缺失,核心原因有两点:一是Maven依赖不完整,缺少JPA核心类;二是手动调用getObject()不符合Spring依赖注入规范,且LocalContainerEntityManagerFactoryBean配置存在缺陷。
具体解决方案
1. 补全Maven依赖
确保pom.xml包含Spring ORM、JPA API及JPA实现(如Hibernate)的依赖:
<!-- Spring ORM核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>你的Spring版本</version> </dependency> <!-- JPA API --> <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version> </dependency> <!-- Hibernate JPA实现 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> </dependency> <!-- 若使用Spring Boot,直接引入starter替代上述依赖 --> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> -->
2. 修正TransactionManager的注入方式
不要手动调用getEntityManagerFactory().getObject(),让Spring自动注入EntityManagerFactory(LocalContainerEntityManagerFactoryBean作为FactoryBean,Spring会自动解析其生成的EntityManagerFactory实例):
@Bean public PlatformTransactionManager getTransactionManager(EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); }
3. 完善LocalContainerEntityManagerFactoryBean配置
当前setJpaVendorAdapter(null)的配置错误,必须指定具体的JPA厂商适配器,否则Spring无法初始化EntityManagerFactory,同时建议添加必要的JPA属性:
@Bean public LocalContainerEntityManagerFactoryBean getEntityManagerFactory() { LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean(); bean.setDataSource(getDataSource()); // 配置Hibernate厂商适配器 HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setShowSql(true); // 可选:显示SQL语句 vendorAdapter.setFormatSql(true); // 可选:格式化SQL bean.setJpaVendorAdapter(vendorAdapter); bean.setPackagesToScan(getClass().getPackage().getName()); // 添加JPA属性(根据你的数据库调整) Properties jpaProperties = new Properties(); jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); jpaProperties.put("hibernate.hbm2ddl.auto", "update"); // 可选:自动生成表结构 bean.setJpaProperties(jpaProperties); return bean; }
4. 验证DataSource配置
确保getDataSource()返回有效的数据源实例,比如使用HikariCP连接池:
@Bean public DataSource getDataSource() { HikariDataSource dataSource = new HikariDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC"); dataSource.setUsername("数据库用户名"); dataSource.setPassword("数据库密码"); return dataSource; }
关键说明
- Spring的FactoryBean(如
LocalContainerEntityManagerFactoryBean)会在容器初始化时自动调用getObject()生成目标实例,无需手动调用,直接通过依赖注入获取即可。 - 必须指定JPA厂商适配器,Spring需要它识别具体的JPA实现(如Hibernate),进而生成正确的EntityManagerFactory。
内容的提问来源于stack exchange,提问作者Golter
相关产品推荐
相关产品推荐

