spring - 错误 - 失败 : drop table if exists user - Springboot and H2

标签 spring spring-boot spring-boot-maven-plugin

我在尝试连接到 H2 数据库时在 Intellij 中收到以下错误。

Hibernate:创建表用户(id bigint 不为空,电子邮件 varchar(255),名称 varchar(255),主键 (id))

2022-11-22 15:53:11.743 WARN 13376 --- [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget 遇到异常接受命令:执行 DDL 时出错“创建表用户(id bigint 不为空,电子邮件 varchar(255 ), 名称 varchar(255), 主键 (id))"通过 JDBC 语句

org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL“创建表用户(id bigint 不为空,电子邮件 varchar(255),名称 varchar(255),主键(id))”时出错通过 JDBC 语句

由 org.h2.jdbc.JdbcSQLSyntaxErrorException 引起:SQL 语句“create table [*]user (id bigint not null, email varchar(255), name varchar(255), Primary key ( ID))”;预期的“标识符”; SQL语句:

创建表用户(id bigint 不为空,电子邮件 varchar(255),姓名 varchar(255),主键 (id))[42001-214]

无法准备语句; SQL [插入用户(电子邮件、姓名、ID)值 (?, ?, ?)];嵌套异常是org.hibernate.exception.SQLGrammarException:无法准备语句

我的代码:

应用程序.java

@SpringBootApplication
public class Application {

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

    @Bean
    CommandLineRunner init(UserRepository userRepository) {
        return args -> {
            Stream.of("John", "Julie", "Jennifer", "Helen", "Rachel").forEach(name -> {
                User user = new User(name, name.toLowerCase() + "@domain.com");
                userRepository.save(user);
            });
            userRepository.findAll().forEach(System.out::println);
        };
    } //* for reference
}

从“@Bean”到“//*”的代码似乎导致了错误,因为删除后运行时没有错误。但是不确定如何措辞以免收到错误。 Following this tutorial.

UserController.java

@RestController
@CrossOrigin(origins = "http://localhost:4200")
public class UserController {


    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/users")
    public List<User> getUsers() {
        return (List<User>) userRepository.findAll();
    }

    @PostMapping("/users")
    void addUser(@RequestBody User user) {
        userRepository.save(user);
    }
}

用户.java

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private final String name;
    private final String email;

    public User() {
        this.name = "";
        this.email = "";
    }

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

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

应用程序属性

spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect

**我尝试过的**

我已经阅读了之前的一些问题here并调整了 application.properties 以包含方言,因为大多数地方都提到了这个问题。

如上所述,我已经删除了 Application.java 中标记的代码,完成后似乎就没有问题了,所以我觉得该区域是问题所在。

最佳答案

就您而言,H2 中有一些保留关键字,其中之一是 User。您正在创建一个包含单词 User 的用户表,该表在 H2 中保留。尝试将表名称更改为 User 以外的名称,例如 Users。或者,当您在 application.properties 中写入数据库 URL 时,添加 ;NON_KEYWORD=USER。可以找到H2的其他保留字here .

关于spring - 错误 - 失败 : drop table if exists user - Springboot and H2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74535707/

相关文章:

java - 从我所有的 Controller 访问一个变量

java - 向 Maven 插件发送参数

spring - 将 Spring Security 全局方法安全性与 Keycloak 集成

java - Spring Boot Maven 插件缺少堆栈跟踪

java - 仅包含带有 Spring Boot maven 插件的配置文件的源包和依赖项

java - 我应该在 Spring 单例 bean 中使用静态吗

java - 如何在 validator 中为 spring Controller 中的特定方法应用不同的行为

java - spring boot redis 操作 throw broken pipe 错误

spring - 使用可分页和排序从 Spring JPA 中的多个表中选择

java - JPA 空参数