gpt4 book ai didi

java - 如何监听集合中的变化?

转载 作者:行者123 更新时间:2023-12-01 08:54:54 24 4
gpt4 key购买 nike

我必须检查旧的嵌入式 DBF 数据库中的更改,该数据库由旧的第三方应用程序填充。我无权访问该应用程序的源代码,也无法在数据库上放置触发器或其他内容。由于业务限制,我无法改变这一点......

我的目标是使用 Java 应用程序从该数据库的表(约 1500 条记录)中捕获新记录、已删除记录和已修改记录,以进行进一步处理。该数据库可在我的 Spring 应用程序中通过 JPA/Hibernate 和 HXTT DBF 驱动程序进行访问。

我现在正在寻找一种方法来有效地捕获第三方应用程序在数据库中所做的更改。

我是否必须定期读取整个表并检查每条记录是否仍然不变或在两次读取中应用任何类型的差异?我可以在 Java 应用程序中设置某种“触发器”吗?如何正确聆听这些变化?

最佳答案

没有 JPA 机制可以在数据更改时从数据库获取回调。

唯一的选择是构建您自己的更改检测。通常,您首先会检测哪些实体被添加、删除以及哪些实体仍然存在。对于仍然存在的实体,您需要检查它们是否已更改,因此该实体需要一个 equals() 方法。一个实体是由它的主键来标识的,所以你需要获取所有主键的集合,一旦你有了这个集合,你就可以轻松地使用 Guava 的 Sets 方法来生成添加、删除、删除的 3 个集合。和现有的(之前和现在),就像这样。

List<MyEntity> old = new ArrayList<>(); // load from the DB last time
List<MyEntity> current = new ArrayList<>(); // loaded from DB now

Map<Long, MyEntity> oldMap = old.stream().collect(Collectors.toMap(MyEntity::getId, Function.<MyEntity>identity() ));
Map<Long, MyEntity> currentMap = current.stream().collect(Collectors.toMap(MyEntity::getId, Function.<MyEntity>identity()));

Set<Long> oldKeys = oldMap.keySet();
Set<Long> currentKeys = currentMap.keySet();

Sets.SetView<Long> deletedKeys = Sets.difference(oldKeys, currentKeys);
Sets.SetView<Long> addedKeys = Sets.difference(currentKeys, oldKeys);
Sets.SetView<Long> couldBeChanged = Sets.intersection(oldKeys, currentKeys);

for (Long id : couldBeChanged) {
if (oldMap.get(id).equals(currentMap.get(id))) {
// entity with this id was changed
}
}

关于java - 如何监听集合中的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42087727/

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