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

Spring项目Model未生成ID且数据无法存入H2数据库求助

问题解决指南

核心问题:数据未被持久化到数据库

你控制器里只打印了User对象,但根本没调用Repository的保存方法,这是数据存不进去的直接原因。另外还有几个细节问题导致ID无法自动生成。

1. 修复控制器,添加数据持久化逻辑

注入UserRepository,调用save()方法完成数据持久化:

@Controller
public class UserController { // 确保控制器类为public

    private final UserRepository userRepository;

    // 构造注入(Spring 推荐方式)
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @PostMapping("/found")
    public String submitForm(@ModelAttribute("user") User user){
        System.out.println(user);
        // 关键步骤:调用save方法将数据写入数据库
        User savedUser = userRepository.save(user);
        System.out.println("保存后的用户ID:" + savedUser.getId()); // 此时ID已自动生成
        return "finders";
    }
}

2. 修正User实体类的关键问题

  • 把User类改为public,否则Spring Data JPA无法通过反射正确处理实体
  • 给所有字段添加Getter/Setter(用Lombok的@Data注解可一键生成,省去手动编写)
  • 直接用LocalDate类型存储日期,无需转成String,JPA原生支持该类型:
import java.time.LocalDate;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User { // 修改为public访问权限

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String scroll;
    private LocalDate date; // 直接使用LocalDate类型

    // 无参构造必须为public,Hibernate实例化实体时需要
    public User() {
        this.date = LocalDate.now();
    }

    public User(String name, String scroll) {
        this.name = name;
        this.scroll = scroll;
        this.date = LocalDate.now();
    }

    // 手动添加Getter/Setter,或用Lombok的@Data注解替代
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getScroll() { return scroll; }
    public void setScroll(String scroll) { this.scroll = scroll; }
    public LocalDate getDate() { return date; }
    public void setDate(LocalDate date) { this.date = date; }

    @Override
    public String toString() {
        return "User{" + "id=" + id + ", name='" + name + '\'' + ", scroll='" + scroll + '\'' + ", date=" + date + '}';
    }
}

如果用Lombok简化代码,只需在类上加@Data注解,并在pom.xml中添加依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

3. 调整UserRepository的访问权限

你的Repository是包私有接口,Spring无法扫描并创建代理Bean,改为public:

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

public interface UserRepository extends JpaRepository<User, Long> { // 修改为public

}

4. 优化数据库配置与调试

在application.properties中添加SQL打印配置,方便调试持久化逻辑:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

启动项目后,访问http://localhost:8080/h2-console,用配置里的jdbc:h2:file:./test连接数据库,检查USER表是否生成,提交表单后查看控制台是否有INSERT语句输出。

5. 清理无效依赖

pom.xml中重复引入了spring-boot-starter-web,删掉其中一个:

<!-- 删除重复的这行依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

总结

按上述步骤修改后,提交表单时:

  1. 控制器会调用Repository完成数据持久化
  2. H2数据库会自动生成自增ID(IDENTITY策略)
  3. 数据可在H2控制台中查询到

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:47:03