Kotlin+SpringBoot连Docker PostgreSQL遇entityManagerFactory创建失败
首先看你抛出的核心错误:
java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
这个问题本质是JPA API版本不兼容,Spring Boot 2.0.1.RELEASE依赖的是JPA 2.1规范,但你的依赖里既没引入Spring Data JPA的核心starter,也没加PostgreSQL驱动,导致EntityManagerFactory创建时找不到JPA 2.1的方法。下面是具体的解决步骤:
1. 修复依赖配置(最关键)
你的Maven依赖缺少两个核心组件:Spring Data JPA Starter(帮你自动管理JPA/Hibernate版本,避免冲突)和PostgreSQL驱动。修改后的依赖如下:
<dependencies> <!-- 新增:Spring Data JPA核心依赖,自动管理JPA API和Hibernate版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <!-- 新增:PostgreSQL驱动,runtime范围即可 --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-reflect</artifactId> </dependency> </dependencies>
注意:不要手动引入JPA API或Hibernate的单独依赖,Spring Boot Starter会帮你匹配兼容的版本,彻底解决版本冲突问题。
2. 检查Docker PostgreSQL的运行状态
确保你的PostgreSQL容器正确映射了端口,并且目标数据库已经创建:
- 如果还没正确启动容器,可以用这条命令:
docker run -d -p 5433:5432 \ -e POSTGRES_DB=irooldb \ -e POSTGRES_USER=root \ -e POSTGRES_PASSWORD=root \ postgres:latest
这条命令会把容器的5432端口映射到本地5433,同时自动创建irooldb数据库和对应的账号密码。
3. 优化实体类(避免后续插入报错)
你的User实体类目前硬编码了id=1,重复插入会触发主键冲突,建议改成自动生成主键的形式:
@Entity data class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 适配PostgreSQL的自增策略 val id: Long? = null, // 设为可空,让JPA自动生成主键 val firstName: String, val lastName: String, val age: Int, val gender: String )
这样调用userRepository.save()时,不需要手动指定id,数据库会自动分配。
4. 完善配置文件(可选但更稳妥)
给application.properties加上PostgreSQL的方言配置,让Hibernate更好地适配PostgreSQL:
server.port=${PORT:9000} spring.cache.cache-names=googleFeeds,internationalFeeds spring.cache.caffeine.spec=maximumSize=100,expireAfterAccess=1800s spring.datasource.url=jdbc:postgresql://localhost:5433/irooldb spring.datasource.username=root spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update spring.jpa.generate-ddl=true # 新增:指定PostgreSQL方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
最后验证步骤
- 执行
mvn clean install -U清理缓存并重新构建项目 - 重启Docker PostgreSQL容器,确保服务正常
- 启动Spring Boot应用,应该就能正常创建EntityManagerFactory了
内容的提问来源于stack exchange,提问作者toto

