You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:17:35