序言

在之前开关柜项目中一开始没有涉及到软删除,因为自己仅仅负责一个用户管理。在开始智慧社区项目之后,软删除的问题成了一个不得不解决的问题了。下面将以智慧社区项目进行梳理。

1.何为软删除

逻辑删除(标记删除),如果逻辑删除不理解,我想标记删除最容易进行理解:使用一个字段,将被删除数据的该字段进行标记,根据该字段可以判断该数据是否已经进行逻辑删除(依旧存在于数据库中,但是查询等获取不到了)。

举个栗子:一个公司有n个人上班,那么突然一天这个公司倒闭了,可以认为该公司被删除了,那么在员工管理的时候,因为该公司被删除了,获取这些员工时后台便会报错,EntityNotFound,或者报无法删除,有限制性约束,如下图:
image.png

2.实现过程:

1.增加标记字段:两种方式:

(1)增加 is_deleted 的布尔型字段
(2)添加 deleted_at 的时间戳字段

第(1)种比较简单,初始化的时候直接设置默认值为false,删除的话便将该字段变为true
第(2)种为设置删除时间,如果删除,则该字段值为删除时间戳;如果未删除,则该字段为null

实现软删除过程中遇到的问题

1.继承后,注解不一定会被继承

父类为Distract:如下图
image.png
子类为Town:如下图
image.png

错误分析:天真的以为继承之后,那么Distract的@SQLDelete和@Where注解等都会被继承
经过测试发现@SQLDelete并没有被继承,只有@Where被继承了

2.了解了NotFound注解

作用:Action to do when an element is not found on a association.(在关联上找不到元素时要执行的操作。)

1.默认org.hibernate.annotations.NotFoundAction.EXCEPTION(The action to perform when an associated entity is not found. By default an exception is thrown关联实体未找到,抛出异常)

2.NotFoundAction.IGNORE: ignore the element when not found in DB(在数据库中找不到元素时忽略该元素)

总结:

1.本次软删除犯的主要错误就是想当然了,误以为继承也可以继承注解,实则需要自己尝试去验证自己的想法。
2.此次软删除并没有用到NotFound注解,因为使用的是有外键约束的数据库,所以在删除的时候便会报错误:不可删除,那么也不存在说关联属性在数据库不存在的情况。


郝泽龙_HZ
182 声望2 粉丝