工作生活

项目中遇到逻辑删除问题

2019-07-03  本文已影响0人  墨色尘埃

系统设置里比如用户、机构管理、字典管理等地方,这里的删除要求逻辑删除,但是这几张表t_user,t_organization,t_dic_type有唯一约束。比如要求机构名唯一,所以逻辑删除了原来数据后,该数据还存在表中,只是status的状态变了,这个时候如果要新增一条同样机构名的数据,会发现新增不进去,因为该表该字段唯一约束了。

image.png

这里的解决方法是新建一个org_name和status的唯一约束,当删除的记录的时候,将status的值改为一个唯一值,可以是雪花算法的id,这里因为表里status为int类型,int类型最大值是2147483647,所以雪花算法生成的值明显超过了,所以这里使用[ ”1”+时分秒毫秒 ]作为status的值。

image.png

项目中,application.yml中逻辑删除的配置

image.png

LogicSqlInjector类中有个方法sqlLogicSet如下:

在启动项目的过程中,会读取表的所有字段,当读取到status字段时,fieldInfo.getLogicDeleteValue()计算的值从application.yml中读取到,即101003。所以只要继承LogicSqlInjector类并重写sqlLogicSet方法,自定义status的值。

image.png

如果映射对象相应的字段上@TableLogic注解里没有默认值的话,默认会从application.yml中取101003的值。所以当没有默认值时,重写该方法会对所有表的status都生效,但是有些表的status的值仍然必须为101003,所以有些特别的表需要订制个性规则。比如t_organization表的映射对象Organization,需要在status属性上的@TableLogic注解里设置一个默认值。这里设置为”random”

image.png

注意表中set.append(“”); 这里赋的值应该使用sql语言里的语句,如date_format(),random(),这样该值就是动态的。而如果使用DateUtil.getMMTime()则不变。

image.png

Organization表中

image.png

当设置为random时,再次启动服务的时候,会进到LogicSqlInjector类的sqlLogicSet方法中,在这里作个性化需求。

为什么没有set.append(DateUtil.getMMTime());使用该方法获取的值作为传入status的值呢?因为只启动一次,所以实际操作中,相当于将这个值传入sql中。但是如果使用set.append("date_format(now(),'%k%i%s%f')/1000"),因为是sql的语法,所以值是变化的。

上一篇 下一篇

猜你喜欢

热点阅读