Java 使用Hibernate进行逻辑删除和创建
当我逻辑删除数据库中代码为“U1”的实体时,我创建了代码为“Ü1”的新实体,出现异常“重复条目”。Hibernate是否有注释来解决此问题 编辑: 插入具有相同代码的新实体时出错如下: org.postgresql.util.PSQLException:错误:重复的键值 唯一约束“国家/地区”详细信息:键(代码)=(AA)已存在 存在 表格如下: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
@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;