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

使用Gradle运行Spring Boot应用时users表未自动创建问题

问题:Spring Boot应用启动正常但MySQL表未自动创建

问题背景

基于Gradle构建的Spring Boot应用,使用Docker部署的MySQL容器作为数据库,运行gradlew bootRun后应用正常启动,但sqldb数据库中的users表未自动创建。

配置与代码

application.properties

spring.application.name=API
server.port=8005

spring.datasource.url=jdbc:mysql://localhost:3307/sqldb?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=YES

## Hibernate properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false

Application.java(原代码)

package com.rest.API;

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

@SpringBootApplication
public class Application {

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

}

User实体类

package com.entities;

import jakarta.persistence.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.util.Date;

@Table(name = "users")
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false)
    private Integer id;

    @Column(nullable = false)
    private String fullName;

    @Column(unique = true, length = 100, nullable = false)
    private String email;

    @Column(nullable = false)
    private String password;

    @CreationTimestamp
    @Column(updatable = false, name = "CreationTime")
    private Date createdAt;

    @UpdateTimestamp
    @Column(name = "UpdationTime")
    private Date updatedAt;

    // getter和setter方法
    public Date getCreatedAt() {
        return createdAt;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    public Date getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }
}

启动终端输出关键信息

2024-12-26T15:20:39.601+05:30  INFO 15824 --- [API] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 18 ms. Found 0 JPA repository interfaces.

问题原因

Spring Boot默认仅扫描启动类所在包及其子包下的组件。启动类Application.java位于com.rest.API包,而User实体类位于com.entities包,不在默认扫描范围内,导致Hibernate无法识别该实体类,因此不会自动创建对应的users表。

解决方法

方法一:修改启动类的包扫描范围

在@SpringBootApplication注解中添加scanBasePackages属性,明确指定需要扫描的包,包含实体类所在的com.entities:

package com.rest.API;

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

@SpringBootApplication(scanBasePackages = {"com.rest.API", "com.entities"})
public class Application {

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

}

方法二:调整实体类的包结构

将User实体类移动到启动类所在包的子包下,例如com.rest.API.entities,这样Spring Boot默认扫描就能覆盖到该类。

方法三:添加JPA Repository接口

创建一个继承JpaRepository的UserRepository接口,放在启动类扫描范围内(比如com.rest.API.repository包),这会触发Spring Data JPA对实体类的检测,间接帮助Hibernate识别实体:

package com.rest.API.repository;

import com.entities.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Integer> {
}

(注意:如果用这个方法,仍需确保实体类在扫描范围内,或者配合方法一的包扫描配置)

验证

修改后重新运行gradlew bootRun,查看数据库是否自动创建users表,同时终端输出中应能看到类似Found 1 JPA repository interfaces的日志,说明扫描成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:39:54