乐趣区

删除数据库中与同步数据冗余的数据(多对多)

思路

先获取冗余的数据
从关联的中间表删除
删除出冗余的数据

如果不删除中间表的数据,数据库中有外键,不能删除冗余数据
private void deleteSurplusHosts(List<Host> hostList) {
List<Host> hosts = hostService.getAll();
List<HostGroup> hostGroupList = hostGroupService.getAllGroups();
List<Host> deletedHostList = new ArrayList<>();

logger.debug(“ 判断获取的计算机不为空 ”);
if (hosts.isEmpty()) {
return;
}

logger.debug(“ 获取移除的计算机 ”);
for (Host host : hosts) {
if (!hostList.contains(host)) {
deletedHostList.add(host);
}
}

logger.debug(“ 删除关联的中间表 ”);
for (HostGroup hostGroup : hostGroupList) {
hostGroup.getHostList().removeIf((host) -> deletedHostList.contains(host));
}
hostGroupRepository.saveAll(hostGroupList);

logger.debug(“ 删除计算机 ”);
hostRepository.deleteInBatch(deletedHostList);
}
思路清晰其实并不难,主要学习了一下 Java 中的 contains 和 removeIf

contains
描述
从数据库中查询出满足一系列条件的记录,然后以对象的形式封装到 List 中去。此时假设有两个条件 A 和 B,满足 A 的记录集和为 ListA,满足 B 的记录集合为 ListB,现在要将 ListA 和 ListB 合并为一个 List,注意 ListA 和 ListB 中可能有重复的记录 (因为可能某条记录即满足条件 A 又满足条件 B),要过滤掉重复的记录。
俩个对象的属性相等,但俩个对象不应定相等。可能不在一块内存,所以需要重写 hashCode()与 equals()

重写 hashCode()与 equals()

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Host host = (Host) o;

if (context != host.context) return false;
return name != null ? name.equals(host.name) : host.name == null;
}

@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + context;
return result;
}
重写 hashCode()与 equals()方法,如果 name 相同,俩个对象就相同;(上述代码`idea`可自动生成)。
removeIf
描述
删除集合中符合条件的成员,empty 集合也可以,但是 null 就炸啦。
例如
private static void removeIfTest() {
List<String> list = Lists.newArrayList(“1″,”12″,”13″,”14″,”15″,”0”);
System.out.println(“ 初始时:”+ list.toString());
list.removeIf(s -> s.contains(“1”));
System.out.println(“ 过滤完:” + list.toString());
}

和过滤 filter 用法有点相似
循环依赖
最后在启动项目时,使用构造函数注入 @Autowired 出现了循环依赖

解决:必需俩边都从构造函数中拿出来,单独注入
关于循环依赖在组长的思否中有详细介绍 Spring Bean 循环依赖
总结
总结、总结也没什么好说的,就是自己又学到了新知识,又成长了,在此多谢有张喜硕组长给我讲解 contains 与 removeIf

退出移动版