postgresql - flyway迁移后弹簧数据不计算SERIAL列的行数
问题描述
我的迁移工作正常,但是在数据库中成功创建迁移并加载测试数据后,我在创建操作时遇到错误。
错误:重复键值违反唯一约束“users_pkey”
详细信息:键 (id)=(1) 已存在。
从 SQL spring 数据日志中查询:
插入用户(account_non_expired、account_non_locked、credentials_non_expired、enabled、password、username)值(?,?,?,?,?,?)
在迁移中,我将几个测试用户设置到表中,但休眠时没有注意到它并尝试将行作为第一个。
我的users
桌子:
CREATE TABLE IF NOT EXISTS users
(
id BIGSERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
account_non_expired BOOLEAN DEFAULT TRUE,
account_non_locked BOOLEAN DEFAULT TRUE,
credentials_non_expired BOOLEAN DEFAULT TRUE,
enabled BOOLEAN DEFAULT TRUE
);
实体类:
@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "users")
@EqualsAndHashCode(exclude = "roles")
@ToString(exclude = "roles")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "account_non_expired")
private Boolean accountNonExpired;
@Column(name = "account_non_locked")
private Boolean accountNonLocked;
@Column(name = "credentials_non_expired")
private Boolean credentialsNonExpired;
@Column(name = "enabled")
private Boolean enabled;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "users_roles",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
private List<Role> roles;
}
实际上,当我在增量停留在正确的位置后发送请求 3 次时,策略会GenerationType.IDENTITY
起作用。BIGSERIAL
每个对 DB Hibernate 的请求都会使 +1。
本次用户数据迁移:
INSERT INTO users (id, username, password)
VALUES (1, 'user', 'pass'),
(2, 'operator', 'pass'),
(3, 'admin', 'pass');
如何修复它以使 Hibernate 可以注意到数据从开始的数据量?
解决方案
为您的 id 创建一个序列:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ")
@SequenceGenerator(name = "USER_SEQ", sequenceName = "USER_SEQ", allocationSize = 1)
private Long id;
像这样创建你的 SQL 文件:
INSERT INTO users (id, username, password)
VALUES (NEXTVAL('USER_SEQ'), 'user', 'pass'),
(NEXTVAL('USER_SEQ'), 'operator', 'pass'),
(NEXTVAL('USER_SEQ'), 'admin', 'pass');
应该自动更新表“用户”的顺序。
推荐阅读
- c# - SQLite 数据库未关闭
- c# - Visual Studio 2017 15.8版中如何去除水平白线?
- gooddata - Gooddata 报告按商店显示天气
- spring-boot - 如何识别客户端是否意外终止对我的 SpringBoot API 的调用(在能够返回响应之前)
- php - 删除特定类 domdocument
- git - 在 ubuntu 上安装 gitlab 后如何发出提交
- python - Pandas 使用自定义体积加权聚合进行重采样
- spring-integration - Spring Integration dsl - HTTP 入站网关使用 multipart/form-data
- c# - C# MVVM 如何将命令添加到 TextBlock
- ruby - 尝试使用 wget 或 curl 下载文件时如何避免重定向?