我有一个新的/分离实体的列表,其中一些可能已经存在于数据库中,但我不知道先验哪些。我想保存这个列表中的实体,以便
- 现有实体被更新(实体的身份基于一个自然id,不是主键))
- 新实体被持久化
最自然/最习惯/最有效的方法是什么呢?
- Spring Data JPA
- 普通JPA/Hibernate
对于有两个列表的场景,我建议如下:一个包含新实体,另一个包含存储实体,但存储实体没有填充@Id字段。
创建一个repo方法,从DB中加载每个现有实体,例如Optional<EntityType> findByFooAndBar(String foo, String bar)
。更新这些加载的中的字段从现有实体列表中缺少@Id的实体中删除。添加这些read &将实体更新到新实体列表。
则Spring Data JPA和plain JPA使用respository.saveAll(collectionOfEntities)
。它更新现有实体并创建新实体。
如果您控制了DB,则废弃当前的PK,并用由自然键元素组成的候选键替换它。想必它们是独一无二的。然后一个简单的saveAll,新的和现有的可以留给JPA/Hibernate。