【发布时间】:2021-07-15 00:09:24
【问题描述】:
我的应用程序接收包含对象的数组,这些对象被映射到实体,然后被持久化。
该对象有一个 id 属性,该属性映射到一个列上,该列上放置了一个唯一约束。具有重复 id 的对象可能会被发送到应用程序。
我正在使用saveAll 方法,但如果任何对象碰巧违反了唯一约束,它会在插入过程中抛出。
有没有简单的方法让它插入所有非重复项并忽略重复项,或者只是更新它们?
我尝试过覆盖哈希和等号,但这没有帮助。
此应用程序每秒接收数十个请求,而我预计收到的重复请求数量很少。
实体:
@Table(name = "table", uniqueConstraints = @UniqueConstraint(columnNames = "natural_id"))
public class Entity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "natural_id", unique = true)
private String naturalId;
// ...
}
存储库:
public interface Repository extends JpaRepository<Entity, Long>, JpaSpecificationExecutor<Entity> {}
保存方法:
void save(List<Entities> entities) {
try {
repository.saveAll(entities);
} catch (Exception e) {
log.error("...");
throw e;
}
}
如果我将保存方法更改为:
@Transactional
void save(List<Entities> entities) {
for (Entities et: entities) {
try {
repository.save(et);
} catch (Exception e) {
log.error("...");
}
}
}
这会让这一切发生在一次交易中吗?我很担心,因为 save 方法通常在每次调用时都会创建一个新事务,这对于每秒接收大量请求的应用程序来说会变得非常慢。
我最终可能必须在插入之前查询数据库以过滤出重复的插入,并在每次捕获到约束违反异常时再次执行此操作。它应该可以工作,但是很丑。
【问题讨论】:
标签: java mysql spring-boot hibernate jpa