gpt4 book ai didi

java - 检查对象是否被引用以防止在不修改数据库的情况下进行软删除

转载 作者:行者123 更新时间:2023-11-30 07:47:15 26 4
gpt4 key购买 nike

如您所见,我在我的系统上使用了软/逻辑删除:

我的实体:

@Where(clause = "deleted='false'")
public class Person {
//...
}

我的服务:

@Override
public ServiceResponse DeletePerson (Person entity) {
ServiceResponse sr = new ServiceResponse<>();

try {
sr = ValidateDeletePerson(entity); //Business logic treatment
if (sr.hasError())
return sr;

Person dbEntity = GetPerson(entity.getPersonID());
dbEntity.setDeleted(true);
_repository.save(dbEntity);

} catch (Exception ex) {
sr.getErrors().add(new ServiceError(ex));
}

return sr;
}

当用户尝试删除一个对象时——实际上只有 boolean 值 deleted 在数据库上被切换为 true 正如我在上面演示的那样 - 我想 在执行此逻辑删除之前,检查对象是否被引用到另一个对象。

因此,如果对象正在被其他人使用/引用,我想将此操作捕获为错误,或其他类似处理以防止删除。

例如,如果 ID 为 5 的人 附加到 Student,则用户无法删除此人。

什么是“最佳实践”来防止它

重要编辑:

1) Person 在 N 个表中被引用,不仅在 Student 上,所以我正在研究实现它的通用方法(也许你可以告诉 hibernate 检查它?)

2) 这个想法是以编程方式进行的,避免对数据库进行修改

最佳答案

您可以在数据库级别使用检查约束。细节是特定于 DBMS 的,但约束的一般思想是

CHECK ((select count(*) from studens 
where studens.id= person.id and person.deleted=false) = 0)

其他解决方案——归档表

您可以通过删除记录并将删除的记录移动到 person_archive 表来避免此问题(数据库触发器可以为您完成)。使用此解决方案,外键将能够保护数据完整性。如果您的 person 表很大,这个解决方案也可能更有效,因为数据库需要读取的数据更少。我会使用 person_archive 表,除非您需要使用 deleted 标志从 UI 轻松恢复已删除的记录,恢复只是翻转标志。使用存档表,恢复工作更多:

  1. 从存档中选择
  2. 插入数据表
  3. 从存档中删除

如果不能修改数据库

如果无法更改数据库,则必须在您的 DAO 类中完成这些检查(您需要为所有相关实体调用查询)。最好确保所有数据库访问都通过这些类进行,否则(如果有人使用直接 SQL)您最终可能会遇到数据库不变性不成立的情况。

关于java - 检查对象是否被引用以防止在不修改数据库的情况下进行软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50009441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com