Spring Boot启动失败:entityManagerFactory Bean创建失败原因排查
Spring Boot + Hibernate CRUD应用启动失败排查
问题场景
启动基于Spring Boot + Hibernate的简单CRUD应用时遭遇启动失败,核心报错片段如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.InstantiationException: Could not instantiate entity 'com.sij.demospringboot.entities.StudentEntity' due to: null ... Caused by: java.lang.Error: Unresolved compilation problems: javax.annotation.Generated cannot be resolved to a type javax.annotation.Generated cannot be resolved to a type at com.sij.demospringboot.entities.StudentEntity.<init>(StudentEntity.java:22) ~[classes/:na] ...
对应的StudentEntity代码:
@Entity @Table(name = "students") @Data @NoArgsConstructor @AllArgsConstructor public class StudentEntity implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @NotEmpty(message="Name is mandatory") private String name; @Column(nullable = true, name = "email") private String email; }
application.properties配置:
server.port = 8082 # JPA/Hibernate spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update # H2 Database spring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:dcbapp spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
根因分析
外层异常中的null只是模糊提示,真正导致启动失败的是编译阶段的类缺失错误:javax.annotation.Generated无法解析。
具体原因:
- 你的Spring Boot版本是6.x(从依赖
spring-beans-6.1.2可判断),该版本基于Jakarta EE 9+规范,所有原Java EE的javax.*包已迁移至jakarta.*。 @Data等Lombok注解生成代码时,默认会添加@Generated注解,但如果Lombok版本过低,它会生成旧的javax.annotation.Generated,而非Jakarta规范的jakarta.annotation.Generated,导致编译时找不到该类。
解决方案
方案1:升级Lombok版本
确保Lombok版本为1.18.26或更高(此版本开始支持Jakarta EE注解)。
Maven依赖更新:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency>
Gradle配置更新:
compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30'
方案2:配置Lombok使用Jakarta注解
若暂时无法升级Lombok,可在项目根目录创建lombok.config文件,添加以下配置:
lombok.addLombokGeneratedAnnotation = true lombok.jakarta.support = true
方案3:临时移除Serializable实现
若不需要序列化功能,可暂时移除implements Serializable和serialVersionUID,避免Lombok生成相关的@Generated注解(不推荐长期使用)。
内容的提问来源于stack exchange,提问作者Tech de Enigma
相关产品推荐
相关产品推荐

