Spring MVC集成Spring Data JPA审计出现JPA元模型为空等错误
问题根因
你现在的核心冲突是原有项目基于Hibernate原生API(SessionFactory)配置,新增JPA配置后出现了两套持久化上下文、两套事务管理器冲突,再加上之前的配置存在路径配置错误、persistence.xml未配置实体扫描的问题,才会触发空指针错误。
分步解决方案
第一步:删除冗余配置,统一持久化实现
不要同时保留两套事务/会话配置,直接基于原有Hibernate配置适配JPA,不需要额外添加persistence.xml,避免配置重复冲突:
- 删除你新增的
persistence.xml文件 - 删除XML里原来配置的
sessionFactory、transactionManagerBean,统一用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
相关产品推荐
相关产品推荐

