【问题标题】:Spring JPA using H2 and Hibernate doesn't auto increment correctly使用 H2 和 Hibernate 的 Spring JPA 不能正确自动递增
【发布时间】:2019-12-20 23:29:53
【问题描述】:

尝试在已存在行的表中插入新行会导致主键违规,因为计数器未正确递增。

我正在尝试使用 Spring CrudRepository 将新行插入到已经包含两行的表中。如果数据库为空,它可以正常工作,然后计数器将按预期工作,当从 Spring 应用程序外部修改数据库时会出现问题,看起来计数器丢失了。

桌子

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, 'test', 'bla@gmail.com', '910e41bd-592d-4a96- a27e-cca45da762d1']"; SQL语句:

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

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

似乎 Spring 没有正确地将计数器与数据库同步..

【问题讨论】:

    标签: java sql spring hibernate h2


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      并在

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

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 2020-07-27
        • 2017-09-25
        • 2023-02-09
        • 2013-09-14
        • 2023-03-18
        • 2019-06-12
        • 2018-09-06
        • 1970-01-01
        相关资源
        最近更新 更多