首页 > 解决方案 > 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 可以注意到数据从开始的数据量?

标签: postgresqlhibernatespring-data-jpaspring-dataflyway

解决方案


为您的 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');

应该自动更新表“用户”的顺序。


推荐阅读