【问题标题】:Update a column in Database based on new and duplicate record根据新记录和重复记录更新数据库中的列
【发布时间】:2020-12-12 13:07:25
【问题描述】:

我正在解决一个问题,我从文件夹中提取文件名列表并将其存储到数据库表中,这个过程将每小时运行一次,所以如果有任何重复的文件名被读取,我需要什么从文件夹中,然后我不需要表中的任何重复记录,它只会更新旧记录,但如果有任何新记录,那么它将插入记录。 我正在使用 Spring Data Jpa,我知道它可以通过使用 saveAll 方法自动完成,但我需要的是,如果文件是重复的,那么它将更新表中的另一列“描述”,表示该记录已更新但何时它正在插入一条新记录,它说它是一条新记录。

我想知道在不使用任何循环的情况下最有效的方法是什么。

【问题讨论】:

  • 为什么不将审计日志保存在另一个带有时间戳的表中?

标签: java spring-boot hibernate spring-data-jpa spring-data


【解决方案1】:

基本上,您有一个异步作业,并且此异步作业存在于 1 个或多个应用程序实例的上下文中。您需要注意以下几个问题:

  1. 读取文件的作业只需要在应用程序的一个分支上运行。为此,您应该使用@Schedlock google it。

  2. 读取文件名后,您需要根据数据库验证它们。此过程存在几个变体:

    A) 测试每个文件会导致每个文件有 1 个选择查询,这可能是不可取的。

    B)您可以从数据库中选择所有现有文件,然后您的工作是将传入的文件分成两组 - 存在的文件和不存在的文件。另一种选择是选择所有现有文件。

    C) 如果文件量太大以至于您无法一次有效地读取它。您可以创建第二个表“传入文件”,然后将所有传入文件保存在那里,然后使用“SAVED_FILES”执行 JOIN 以找出已保存的文件。

【讨论】:

  • 有什么直接的方法可以知道哪些记录正在更新,哪些记录是新的?还是手动将新记录与表中的记录进行比较是唯一的方法?
  • 当您读取文件名时,包含文件名的列表被分离。您不知道文件名是否存在。您需要应用程序中的信息。你可以根据我告诉你的 3 种机制找到它。管理列表后,您就可以判断它是新文件夹还是现有文件夹。
  • 我个人会选择两张表的解决方案。 1 用于传入文件 1 用于已持久化的文件。
  • @Gauravsingh ID 在数据库中。当您阅读新文件时,您没有 ID 的概念,您只有文件名的概念。从数据库的角度来看,拥有 2 个具有相同文件名的 IDS 是非常好的。现在,如果你想让你的文件名成为另一个故事的 ID。
  • @Gauravsingh 认为而不是描述列具有创建时间和更新时间。然后你通过“@CreateTimestamp”和“@UpdateTimestamp”注释,hibernate 会小心的。
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多