我在尝试连接到 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/