Java 使用Hibernate进行逻辑删除和创建

Java 使用Hibernate进行逻辑删除和创建,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,当我逻辑删除数据库中代码为“U1”的实体时,我创建了代码为“Ü1”的新实体,出现异常“重复条目”。Hibernate是否有注释来解决此问题 编辑: 插入具有相同代码的新实体时出错如下: org.postgresql.util.PSQLException:错误:重复的键值 唯一约束“国家/地区”详细信息:键(代码)=(AA)已存在 存在 表格如下: @Entity @Table(name = "Country") @SQLDelete(sql = "UPDATE Co

当我逻辑删除数据库中代码为“U1”的实体时,我创建了代码为“Ü1”的新实体,出现异常“重复条目”。Hibernate是否有注释来解决此问题

编辑:

插入具有相同代码的新实体时出错如下:

org.postgresql.util.PSQLException:错误:重复的键值 唯一约束“国家/地区”详细信息:键(代码)=(AA)已存在 存在

表格如下:

@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;

    ....

}

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

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
);
这将使您能够删除代码为“U1”的对象,并添加另一个代码相同的对象。
您可以查看这个很棒的教程:

删除U1后,您可以调用session.flush()和session.clear()并尝试保存新的U1吗?我在JpaRepository中没有方法(clear()),我应该有这个吗?我使用deleteById和flush。有必要将date_delete设置为类的Id以解决此问题?我认为问题可能与记录Id有关,因为行只在date_delete atribute中更改,然后在具有相同Id的新插入处出现此错误(“重复键”)。但我真的不知道
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;