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

Kotlin+SpringBoot连Docker PostgreSQL遇entityManagerFactory创建失败

解决Kotlin+Spring Boot+PostgreSQL的BeanCreationException错误

首先看你抛出的核心错误:

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

最后验证步骤

  1. 执行mvn clean install -U清理缓存并重新构建项目
  2. 重启Docker PostgreSQL容器,确保服务正常
  3. 启动Spring Boot应用,应该就能正常创建EntityManagerFactory了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:52:33