使用H2和Hibernate的Spring JPA无法正确自动递增

时间:2019-08-14 11:51:12

标签: java sql spring hibernate h2

由于计数器无法正确递增,尝试在具有现有行的表中插入新行会给我造成主键冲突。

我正在尝试使用Spring CrudRepository将新行插入到已经包含两行的表中。如果数据库为空,则工作正常,计数器将按预期工作,当从Spring Application外部修改数据库时出现问题,似乎计数器丢失了。

表格

CREATE TABLE apiusers (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(250) NOT NULL,
  email VARCHAR(250) NOT NULL,
  apikey VARCHAR(250) NOT NULL
);

POJO:

@Entity
@Table(name = "apiusers")
@Data
public class ApiUser {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "APIUSERS_PK_SEQ")
    private Long id;

    private String name;
    private String email;
    private String apikey;

    public ApiUser() {
    }

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

我得到的错误是: 由以下原因引起:org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:唯一索引或主键冲突:“ PUBLIC.APIUSERS(ID)上的主键[1,'测试','bla @ gmail.com','910e41bd-592d-4a96- a27e-cca45da762d1']“; SQL语句:

这是因为Spring试图插入与最后一行具有相同ID的行,从而导致冲突。

此外,我尝试了@GeneratedValue(strategy = GenerationType.AUTO),没有任何运气。

看来Spring不能正确地将计数器与数据库同步。

2 个答案:

答案 0 :(得分:2)

我使用@GeneratedValue(strategy = GenerationType.IDENTITY)解决了这个问题。

答案 1 :(得分:1)

您需要在实体注释之后添加以下代码,例如

@Entity
@Table(name = "apiusers")
@SequenceGenerator(name = "SECQNAMEINENTITY", sequenceName = "DB_SECQ NAME", allocationSize = 1)
@Data
public class ApiUser {

并在

中传递SECQNAMEINENTITY
 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "SECQNAMEINENTITY")