首页 > 解决方案 > 使用 Hibernate 进行逻辑删除和创建

问题描述

@Entity
@Table(name = "Country")
@SQLDelete(sql = "UPDATE Country SET date_deleted=NOW() WHERE code = ?")
@Where(clause = "date_deleted is NULL")
public class Country {

    @Id
    @Column(name = "code", nullable = false)
    private String code;

    @Column(name = "description")
    private String description;

    @Column(name = "date_deleted")
    private Date date_deleted;

    ....

}

当我使用代码“U1”逻辑删除数据库中的实体时,我创建了一个具有相同代码“Ü1”的新实体,发生异常“重复条目”。Hibernate 有注解来解决这个问题吗?

编辑:

插入具有相同代码的新实体时的错误是:

org.postgresql.util.PSQLException:错误:重复键值违反唯一约束“country_pkey”详细信息:键(代码)=(AA)已经存在。

表格是:

CREATE TABLE public.country(
    code bpchar(2) NOT NULL,
    description bpchar(50) NULL,
    date_deleted timestamp NULL,
    CONSTRAINT country_pkey PRIMARY KEY (code),
    CONSTRAINT constraint_country UNIQUE (date_deleted, code) -- I add this constraint
);

标签: javaspringhibernatejpa

解决方案


由于您管理该code列,并且您可以拥有多个具有相同代码的条目,因此一种解决方案是拥有一个id自动生成的列。

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;

这将使您能够删除具有代码“U1”的对象并添加具有相同代码的另一个对象。您可以查看这个很棒的教程:https ://vladmihalcea.com/the-best-way-to-soft-delete-with-hibernate/


推荐阅读