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

SpringBoot 3.2.2应用无法根据Entity生成MySQL表求助

SpringBoot JPA 无法生成数据库表问题排查与修复

问题描述

使用SpringBoot 3.2.2、Java 17、MySQL,基于Entity生成数据库表时,应用启动正常但无任何表创建。相关配置与代码如下:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>it.newEra</groupId>
    <artifactId>BookingYourLuggage</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>BookingYourLuggage</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <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>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

主类

package it.newEra.yourLuggage;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BookingYourLuggageApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookingYourLuggageApplication.class, args);
    }

}

Entity类

package it.newEra.yourLuggage.model;

import java.math.BigDecimal;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@AllArgsConstructor
public class Drawer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "drawer_type")
    private String drawerType;

    @Column(name = "drawer_prive")
    private BigDecimal drawerPrice;

    @Column(name = "is_booked")
    private boolean isBooked = false;

}

application.yml

server:
  port: 9192
spring:
  datasource:
    username: root
    password: Password.
    url: jdbc:mysql://127.0.0.1:3306/booking_your_luggage?createDatabaseIfNotExist=true
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show_sql: true
    properties:
      hibernate:
        ddl-auto: update
        format-sql: true
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 5MB
      file-size-threshold: 2MB

问题排查与修复方案

1. 实体类缺少无参构造方法

JPA要求实体类必须提供无参构造方法,Hibernate需要通过反射实例化实体对象。当前代码使用@AllArgsConstructor注解后,Lombok不会自动生成无参构造,导致Hibernate无法处理该实体。

修复: 在Drawer类上添加@NoArgsConstructor注解:

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor // 新增无参构造
public class Drawer {
    // ... 现有代码
}

2. JPA DDL配置层级错误

当前ddl-auto配置位于spring.jpa.properties.hibernate下,虽然Hibernate可以识别,但SpringBoot推荐使用标准配置路径spring.jpa.hibernate.ddl-auto,避免配置不生效问题。

修复: 修改application.yml中的JPA配置:

spring:
  jpa:
    show_sql: true
    hibernate:
      ddl-auto: update # 修正配置位置
      format_sql: true # 统一为下划线命名的配置项
    properties:
      hibernate:
        # 移除原ddl-auto配置

3. 实体类列名拼写错误

drawerPrice字段对应的列名配置为drawer_prive(拼写错误),虽然不影响表生成,但会导致数据库字段名错误,建议修正:

修复: 修正列名配置:

@Column(name = "drawer_price") // 修正拼写错误
private BigDecimal drawerPrice;

4. 验证配置生效

启动应用后,查看控制台输出的SQL语句,若出现CREATE TABLE drawer (...)的DDL语句,说明表生成成功。若仍无输出,可添加日志配置查看详细SQL执行情况:

logging:
  level:
    org.hibernate.SQL: DEBUG
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:17:02