当前位置: 首页 > 知识库问答 >
问题:

使用H2和Hibernate的Spring JPA不能正确地自动递增

华星剑
2023-03-14

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

我试图使用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
);

波乔:

@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 ',' 910 e 41 BD-592d-4a 96-a27e-CCA 45 da 762d 1 ']";SQL语句:

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

此外,我尝试了@DynamatedValue(策略=GenerationType.AUTO),但没有任何运气。

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

共有2个答案

袁泰
2023-03-14

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

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

并通过SECQNAMEINENTITY

 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "SECQNAMEINENTITY")
松铭
2023-03-14

我用@ generated value(strategy = generation type)解决了这个问题。身份)。

 类似资料:
  • 我用的是Hibernate4.3.10,最后是mysql 5.6。 对于刷新模式,默认为“自动”,对吗?在本例中,如果有关于持久化A、选择B、提交的步骤,那么hibernate应该先执行选择B,然后执行持久化A,对吗? (我的理解是基于https://dzone.com/articles/dark-side-hibernate-auto-flush,还是我误解了这篇文章?) 如果我的理解是正确的,

  • 我开始制作一个简单的spring boot应用程序。 我的第一步是利用Spring JDBC支持,使用默认的H2内存数据库。对于示例数据,我在src/main/resources中有schema.sql和data.sql。 所以当spring启动时,它也会执行这两个脚本并填充H2数据库,我可以通过H2控制台访问它。

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为。(如果使用包装器) 在某些情况下,该策略被解析为或,因此你可能需要手动将其设置为(取决于基础数据库)。 似乎+ 指定序列名称对你有用。

  • 问题内容: 我创建了下表,但出现错误; “ AUTO_INCREMENT”附近的语法不正确。 的SQL 我想我做对了所有事情。有人可以帮我吗? 问题答案: 它不在SQL Server中。 尝试以下方法:

  • 我一直在试图调试为什么我的DropDownChoice在一个简单的表单中只有下拉和提交按钮,但几个小时来没有正常工作。

  • 我试图更好地理解JPA/Hibernate和SQL服务器的注释。 我创建了一个简单的项目:一个名为“Articles”的抽象类。有两个类继承了它:Ramette添加了权重,Pen添加了颜色。下面的代码无效,我无法更正错误。你有什么想法吗?非常感谢。