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

Spring Boot中@Entity注解失效,H2数据库未生成对应数据表

问题:配置H2数据库后未自动生成User表

我是Spring Boot新手,跟着YouTube教程配置H2数据库后,已经在User.java里加了@Entity和@Id注解,但H2控制台里始终看不到带id和name字段的User表,重复操作也没用,求指出遗漏的配置或步骤。


相关代码文件

Application.java

package com.example.demo;

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

@SpringBootApplication
public class DbApplication {

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

}

User.java

package com.example.demo;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class User {
    
    @Id
    private int id;
    private String name;
    
    public String toString() {
        return name+ " : " + id ;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

UserController.java

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class UserController {
    @Autowired
    UserDAO userdao;
    
    @RequestMapping("index")
    public String user() {
        return "index.jsp";
    }
    @RequestMapping("addUser")
    public String addUser(User user) {
        userdao.save(user);
        return "index.jsp";
    }
    @RequestMapping("getUser")
    public ModelAndView getUser(@RequestParam int id) {
        ModelAndView mav = new ModelAndView("showUser.jsp");
        User user = userdao.findById(id).orElse(null);
        mav.addObject(user);
        return mav;
    }
}

application.properties

spring.h2.console.enabled= true
spring.datasource.platform= h2
spring.datasource.url=jdbc:h2:mem:testdb

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.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.manigandan</groupId>
    <artifactId>DB</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>DB</name>
    <description>demo website</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.h2database</groupId>
            <artifactId>h2</artifactId>
            
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>10.1.7</version>
</dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

解决步骤

1. 添加JPA自动建表配置

在application.properties中加入以下配置,让Hibernate自动根据实体类生成/更新表结构:

spring.jpa.hibernate.ddl-auto=update

开发环境也可以用create(每次启动重建表),但update更适合持续开发场景。

2. 补全UserDAO接口定义

代码中注入了UserDAO但未提供实现,需要创建继承自JpaRepository的接口:

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

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

没有这个接口,Spring无法识别持久层操作,也会影响实体类扫描和表生成。

3. 确认H2控制台连接参数

打开H2控制台时,确保JDBC URL与application.properties中的spring.datasource.url完全一致(jdbc:h2:mem:testdb),否则会连接到不同的内存数据库,自然看不到表。

4. 触发数据库操作

JPA可能会延迟初始化表,直到第一次执行数据库操作。启动项目后,调用addUser接口插入一条数据,再去H2控制台查看,表应该会生成。

5. 验证实体类扫描范围

@SpringBootApplication默认扫描当前包及其子包,你的User类与DbApplication同属com.example.demo包,这部分没问题。如果实体类在其他包,需在DbApplication上添加@EntityScan("你的实体类包路径")。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:15:00