Hibernate SoftDelete 注解
文章目录
- Hibernate SoftDelete 注解
- 1、简介
- 2、软删除模型
- 3、测试 `Tag` 实体上的 Hibernate `@SoftDelete` 注解
- 4、测试 `PostDetails` 实体上的 Hibernate `@SoftDelete` 注解
- 5、测试 `PostComment` 实体上的 Hibernate `@SoftDelete` 注解
- 6、测试 `Post` 实体上的 Hibernate `@SoftDelete` 注解
- 7、结论
1、简介
在本文中,我们将看到如何使用 Hibernate 的 @SoftDelete
注解来为 JPA 实体启用软删除功能。
2、软删除模型
Tag
实体的映射如下:
@SoftDelete
注解是在 Hibernate 6.4 中引入的,允许我们启用原生的软删除机制。
Post
实体的映射如下:
注意,Post
实体和 tags
集合都使用了 @SoftDelete
Hibernate 注解。
前者用于软删除 post
表记录,后者用于软删除 post_tag
表行。
post_details
表通过 @MapsId
注解映射到 PostDetails
实体,该注解允许我们在父 post
和子 post_details
表之间重用主键,如下所示:
post_comments
表映射到 PostComment
实体如下:
当我们使用 @SoftDelete
注解时,还需要在使用 FetchType.LAZY
策略的 @ManyToOne
关联上添加 @NotFound
注解。这是因为外键列的存在并不一定意味着父实体仍然存在,因为它可能已经被软删除。
3、测试 Tag
实体上的 Hibernate @SoftDelete
注解
假设我们创建了以下 Tag
实体:
当删除其中一个 Tag
实体时:
Hibernate 将执行以下 UPDATE
语句,将 deleted
列设置为 true
:
在 Tag
实体被软删除后,我们可以看到 JPQL 查询无法找到它:
在后台,Hibernate 在引用带有 @SoftDelete
注解的实体时,会在 WHERE
子句中添加 deleted = false
谓词:
4、测试 PostDetails
实体上的 Hibernate @SoftDelete
注解
考虑到我们有一个 Post
实体,它有一个一对一的 PostDetails
子实体:
当通过父 Post
实体上的 removeDetails
方法删除 PostDetails
时:
Hibernate 生成以下 SQL UPDATE
语句,软删除 post_details
记录:
在 PostDetails
实体被软删除后,我们将无法使用 find
方法获取它:
5、测试 PostComment
实体上的 Hibernate @SoftDelete
注解
假设我们有一个 Post
实体,它有两个 PostComment
子实体:
当通过父 Post
实体上的 removeComment
方法删除一个 PostComment
实体时:
Hibernate 生成以下 UPDATE
语句:
在 PostComment
被软删除后,Hibernate 会在尝试直接通过 find
方法或间接通过获取 comments
集合时隐藏 PostComment
实体:
6、测试 Post
实体上的 Hibernate @SoftDelete
注解
如果我们创建一个包含所有关联的 Post
实体,如以下示例所示:
当删除 Post
实体时:
Hibernate 生成以下 SQL UPDATE
语句:
注意,通过简单地使用 @SoftDelete
Hibernate 注解,每个表记录都被软删除。
如果你喜欢这篇文章,我相信你也会喜欢我的书和视频课程。
7、结论
与我们之前必须实现的机制相比,Hibernate @SoftDelete
注解非常容易使用。
如果你想受益于这种原生机制,那么你应该将你的 Hibernate 版本升级到 6.4 或更新版本。