Spring Data JPA - 手动插入后的密钥冲突

Posted

技术标签:

【中文标题】Spring Data JPA - 手动插入后的密钥冲突【英文标题】:Spring Data JPA - Key Violation after manual insert 【发布时间】:2019-06-09 07:10:42 【问题描述】:

我有一个使用 Spring Boot / hibernate 的简单项目,在单元测试中插入新值时出现错误。 对于测试,我使用带有虚拟数据的新数据库(data.sql) 启动后,当插入测试运行时,出现错误“Key Violation”:

2019-01-15 10:14:00,286 ERROR [main] org.hibernate.engine.jdbc.spi.SqlExceptionHelper: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.NATURAL_PERSON_CATEGORY(ID)"; SQL statement:
insert into natural_person_category (created_by, creation_date, deletion_by, deletion_date, modification_date, modificationd_by, comment, label, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?) [23505-194]

我使用注释管理 id:@Id @GeneratedValue (strategy = GenerationType.AUTO)

当我更改我的虚拟数据的 ID(例如从 1 到 100)时,它就可以工作了......

我的 POJO:

@Data
@Entity
@Table
public class NaturalPerson 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonProperty("id_natural_person")
    protected Integer id;

    @JsonProperty("first_name")
    private String firstName;

    @JsonProperty("last_name")
    private String lastName;

    @JsonProperty("is_minor")
    private boolean isMinor;

    private String mail;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Address> addresses;


    @OneToOne(cascade = CascadeType.ALL)
    @JsonProperty("category")
    private NaturalPersonCategory naturalPersonCategory;

    @JsonProperty("is_main")
    private boolean isMain;


    @JsonGetter("fullname")
    public String getFullname() 
        return this.firstName + " " + this.lastName;
    



@数据 @实体 @桌子 公共类地址

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonProperty("id_address")
    protected Integer id;

    private String line1;
    private String line2;
    private String line3;

    @JsonProperty("postal_code")
    private String postalCode;

    private String city;

    @ManyToOne
    @JoinColumn(name = "id_country")
    private Country country;

    @JsonProperty("start_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;

    @JsonProperty("end_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;


@Data
@Entity
@Table
public class NaturalPersonCategory 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonProperty("id_natural_person_category")
    protected Integer id;

    @NotNull
    protected String label;

    @Column(columnDefinition = "TEXT")
    protected String comment;


【问题讨论】:

您使用的是哪个数据库? Hello H2 & MSSQL 所以您描述了解决问题的方法。问题是什么? 【参考方案1】:

我已经用

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

【讨论】:

以上是关于Spring Data JPA - 手动插入后的密钥冲突的主要内容,如果未能解决你的问题,请参考以下文章

什么是Spring Data JPA?

Spring-data-jpa:批量插入不起作用

为啥手动定义的 Spring Data JPA 删除查询不会触发级联?

spring data jpa:插入而不是删除

在同一事务中删除后的 Spring Data JPA 计数

spring data jpa使用spring data jpa时,关于service层一个方法中进行删除和插入两种操作在同一个事务内处理