【问题标题】:Differential update on repository from list列表中存储库的差异更新
【发布时间】:2023-03-03 13:12:01
【问题描述】:

是否有一些奇特的方法可以在 Spring 中对行列表进行“差异”更新? 例如,我的数据库中有这样的行:

  • A 行
  • B 行
  • C 行

我得到了一套新的物品:

  • A 行
  • C 行
  • D 行

我想要的结果是:

  • A 行(已更新,未删除和添加)
  • C 行(已更新,未删除和添加)
  • D 行(已添加)
  • 已删除 B 行

在这里跟踪创建和修改日期至关重要。在 Spring 中是否有一些方便的方法来实现这一点?

提前感谢您的任何提示。

解决方案:
我还没有找到一种“好”的方法来做到这一点。最后,我添加了带有@CreationTimestamp 和@UpdateTimestamp 的日期字段(尽管后者可能是一个简单的日期/本地日期字段)。在上传新集时,对于每一行,我检查存储库是否已经有这样的对象(必须通过比较除 ID 之外的所有字段来完成,因为 ID 是自动生成的,我需要按值进行比较 - 幸运的是每个值组合我的系统是独一无二的)。 如果是,则更新日期更改为当前日期。 完成此操作后,我只是删除了更新日期早于当前日期的实体。这不是一种花哨的方式,而且速度很慢,但效果很好。

【问题讨论】:

  • "Spring" 不做数据持久化,JPA 做。定义 JPA 实体和持久性代码而不是表

标签: java spring hibernate jpa


【解决方案1】:

如果您使用实体,您可以使用 Spring CRUD 存储库。他们有一个名为 save() 的方法,用于接收实体列表。如果任何实体的ID已经存在,存储库将更新它,否则它将在数据库中创建一条新记录。

您可以查看 Spring 文档here

如果这篇文章对你有用,请告诉我。

【讨论】:

  • 感谢您的回复!我广泛使用 CRUD 存储库,但方法 save() 不会删除未出现在新列表中的行。
  • 如果您想包含删除功能,您可能需要实现自己的功能...除非您的数据库表表示键值对...如果这就是您可以检查的重点帖子:stackoverflow.com/questions/7525320/… 使用@CollectionTable JPA 在适当的情况下添加、删除或更新数据。
【解决方案2】:

如果您使用 JPA 中的 EntityManager,您可以使用entityManager.merge(yourEntity),如果 id 与您的数据库 id 不对应,则此查询将添加新行,否则它将以其他方式更新您的字段。

还有来自Session(它的hibernate SessionFactory)的常用方法,还有方法session.saveOrUpdate(yourEntity)

【讨论】:

  • 感谢您的回复!但是,就我而言,这两者都不会删除未出现在新列表中的行。如果我错了,请纠正我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 2020-01-13
  • 2017-10-28
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多