思路
- 先获取冗余的数据
- 从关联的中间表删除
- 删除出冗余的数据
如果不删除中间表的数据,数据库中有外键,不能删除冗余数据
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。