java - 使用 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
);
解决方案
由于您管理该code
列,并且您可以拥有多个具有相同代码的条目,因此一种解决方案是拥有一个id
自动生成的列。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
这将使您能够删除具有代码“U1”的对象并添加具有相同代码的另一个对象。您可以查看这个很棒的教程:https ://vladmihalcea.com/the-best-way-to-soft-delete-with-hibernate/
推荐阅读
- blazor - Blazor wasm 如何处理代码和凭据客户端流
- mongodb - 从 Mongodb 中的字符串中删除重复字符
- react-native - React Native - 如何更新整个应用程序的值
- neural-network - 为什么:输入类型(torch.cuda.FloatTensor)和权重类型(torch.FloatTensor)应该相同
- powershell - 比较列值并合并
- javascript - 根据列表中图像的数量按比例调整动态图像列表的大小
- navigation - 导航 - 从区域检索用户输入
- bash - Alpine 中的 ASH/BASH:如何从从列表文件读取的变量名列表中扩展变量
- python - 在R Markdown OSError中运行python:[WinError 6]句柄无效
- sockets - 具有 SO_REUSEPORT 的多个线程中的 UDP 服务器套接字