gpt4 book ai didi

java - 在 Spring Boot JPA 中,为什么我会得到 "Table already exists; SQL statement:"

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:21 24 4
gpt4 key购买 nike

我正在使用 JPA 存储库构建一个 Spring Boot 项目。为了进行测试,我使用了 H2 内存数据库。我使用 schema.sql 文件初始化数据库,该文件的摘录如下:

CREATE TABLE `config_user_preset_dataclass` (
`user_preset_dataclass_id` int(11) NOT NULL AUTO_INCREMENT,
`user_preset_id` int(11) NOT NULL,
`dataclass_name` varchar(100) NOT NULL,
`ngdp_audit_timestamp` datetime NOT NULL,
`ngdp_update_timestamp` datetime NOT NULL,
PRIMARY KEY (`user_preset_dataclass_id`),
UNIQUE KEY `idx_config_user_preset_dataclass_1` (`user_preset_id`,`dataclass_name`),
CONSTRAINT `fk_config_user_preset_dataclass_1` FOREIGN KEY (`user_preset_id`) REFERENCES `config_user_preset` (`user_preset_id`)
);

schema.sql 通过将数据库 URL 设置为 DB_URL=jdbc:h2:mem:data360;INIT=RUNSCRIPT FROM 'classpath:schema.sql';DATABASE_TO_UPPER=false 来初始化数据库,并且我已验证这是正常的。

在我的src/test/resources/application.properties中,我设置了spring.jpa.hibernate.ddl-auto=validate,所以不应该有任何二次尝试生成表。但是,当我运行一个简单的测试来保存 JPA 模型时,我得到:

2018-04-11 17:59:17.847 ERROR 11540 --- [o-auto-1-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Table "CONFIG_USER_PRESET" already exists; SQL statement:
CREATE TABLE `config_user_preset` (
`user_preset_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(6) NOT NULL,
`preset_name` varchar(200) NOT NULL,
`ngdp_audit_timestamp` datetime NOT NULL,
`ngdp_update_timestamp` datetime NOT NULL,
PRIMARY KEY (`user_preset_id`),
UNIQUE KEY `idx_user_preset_config_1` (`user_id`,`preset_name`)
) [42101-196]

错误清楚地表明某些东西正试图再次生成表格。

它会是什么?

有趣的是,如果我使用 GenerationType.IDENTITY 作为主键,这个错误就会消失。但是,这会导致另一个问题,所以我无法做到这一点。

[编辑]

@Entity
@Table(name = "config_user_preset_dataclass")
public class UserPresetDataclass {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_preset_dataclass_id")
private long presetDataClassId;

@Column(name = "user_preset_id")
private long userPresetId;

@Column(name = "dataclass_name")
private String dataclassName;

...

[/编辑]

最佳答案

可能您的数据库仍在内存中,这就是您收到此错误的原因。我提出两种选择:

  1. 更改 SQL 语句。您可以使用 CREATE TABLE IF NOT EXISTS config_user_preset ... 而不是 CREATE TABLE config_user_preset...
  2. 如果您使用的是 Spring,则可以创建嵌入式数据库。点这里Spring embeddeb db table already exists error .

关于java - 在 Spring Boot JPA 中,为什么我会得到 "Table already exists; SQL statement:",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49786517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com