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

Spring MVC集成Spring Data JPA审计出现JPA元模型为空等错误

问题根因

你现在的核心冲突是原有项目基于Hibernate原生API(SessionFactory)配置,新增JPA配置后出现了两套持久化上下文、两套事务管理器冲突,再加上之前的配置存在路径配置错误、persistence.xml未配置实体扫描的问题,才会触发空指针错误。

分步解决方案

第一步:删除冗余配置,统一持久化实现

不要同时保留两套事务/会话配置,直接基于原有Hibernate配置适配JPA,不需要额外添加persistence.xml,避免配置重复冲突:

  • 删除你新增的persistence.xml文件
  • 删除XML里原来配置的sessionFactory、transactionManager Bean,统一用JPA配置生成这两个对象

第二步:修改JPA配置类,适配原有配置

把原来XML里的扫描路径、Hibernate配置都迁移到JPA配置里:

@Configuration
// 注意这里是扫描Repository接口的包,不是实体包,你之前的配置写错了路径
@EnableJpaRepositories(basePackages = "com.myproject.project.metier.domain.repositories")
@EnableTransactionManagement
@EnableJpaAuditing(auditorAwareRef = "jpaAuditorProvider")
public class JpaConfig {
    @Autowired
    private DataSource dataSource;
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        // 扫描实体类的包,和你之前XML里的packagesToScan保持一致
        em.setPackagesToScan("com.myproject.project");
        // 用Hibernate作为JPA实现
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        // 加载原有Hibernate配置
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        hibernateProperties.setProperty("hibernate.show_sql", "false");
        hibernateProperties.setProperty("hibernate.format_sql", "true");
        hibernateProperties.setProperty("hibernate.use_sql_comments", "true");
        hibernateProperties.setProperty("jadira.usertype.autoRegisterUserTypes", "true");
        em.setJpaProperties(hibernateProperties);
        return em;
    }
    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
    // 兼容原有代码需要SessionFactory的场景
    @Bean
    public SessionFactory sessionFactory(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.unwrap(SessionFactory.class);
    }
    @Bean
    public AuditorAware<String> jpaAuditorProvider() {
        // 后续可以改成从上下文取当前登录用户
        return () -> Optional.of("Administrator");
    }
}

第三步:给实体类添加审计注解

在需要审计的实体类上添加对应注解,否则审计功能不会生效:

  • 实体类上加@EntityListeners(AuditingEntityListener.class)
  • 对应审计字段添加@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy注解,示例:
@Entity
@EntityListeners(AuditingEntityListener.class)
public class YourEntity {
    // 其他业务字段
    @CreatedBy
    private String createBy;
    @CreatedDate
    private Date createTime;
    @LastModifiedBy
    private String updateBy;
    @LastModifiedDate
    private Date updateTime;
    // 省略getter、setter
}

第四步:确认依赖版本匹配

检查pom.xml里的依赖版本,要和你当前使用的Spring 4.3.25版本兼容:

<!-- Spring Data JPA -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.11.23.RELEASE</version> <!-- 适配Spring 4.3.x的版本 -->
</dependency>
<!-- Hibernate EntityManager 适配JPA -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.11.Final</version> <!-- 和你现有hibernate4版本匹配 -->
</dependency>

补充说明

你最开始出现JPA metamodel为空的报错,核心原因之一就是@EnableJpaRepositories的路径配置错误,这个注解是用来扫描Spring Data JPA的Repository接口的,实体类的扫描是在entityManagerFactory的setPackagesToScan方法中配置的。

内容的提问来源于stack exchange,提问作者Genku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:54:04