java Spring数据JpaRepository已批处理。然后保存()。flush()导致重复密钥异常
根据这里的许多帖子,JpaRepository抽象应该表现得像一个crudepository。这意味着在调用。保存(实体)方法将根据密钥是否已存在执行插入或更新。 我有一个简单的用例,在这个用例中,我使用一个更新事件,收集一个实体列表,对这些实体应用必要的更改,并将该列表作为更新持久化。 我正在使用Postgres DB、JPA和hibernate
@Entity(name = EPISODE_RESEARCH_TABLE)
data class EpisodeEntity(
override val created: OffsetDateTime,
override val externalId: String?,
@Id
override val id: String,
override var modified: OffsetDateTime,
override val title: String
)
@Service
class EpisodeService(
private val repository: JpaRepository<EpisodeEntity, String>
) : <..> {
override fun modelFromEntity(entity: EpisodeEntity): EpisodeResearch =
<...>
override fun entityFromModel(model: EpisodeResearch): EpisodeEntity =
<...>
override fun update(models: Collection<EpisodeResearch>): Set<EpisodeResearch> =
models
<...>
.map { repository.save(it) }
.also { repository.flush() }
<...>
override fun create(models: Collection<EpisodeResearch>): Set<EpisodeResearch> =
update(models)
override fun delete(models: Collection<EpisodeResearch>): Set<EpisodeResearch> =
<...>
}
配置显示:
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.jdbc.batch_size=1000
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.jpa.properties.hibernate.connection.autocommit=false
在执行命令时。save()和final。flush()日志显示
HHH000315: Exception executing batch [java.sql.BatchUpdateException: Batch entry 0 insert into episode_research (created, external_id, modified, title, id) values (<...>) was aborted: ERROR: duplicate key value violates unique constraint "episode_research_pkey" Detail: Key (id)=(<...>) already exists. Call getNextException to see other errors in the batch.], SQL: insert into episode_research (created, external_id, modified, title, id) values (?, ?, ?, ?, ?)
所以很明显,执行的查询只是一个简单的插入,在这样的操作中肯定会失败
所以这里的问题是: 为什么行为与预期的不同毕竟,这些抽象甚至没有提供明确的更新方法
使用EntityManager提供了一个选项,但是这需要与一位完全死心塌地只使用我宁愿避免的粗糙的假设性抽象的同事进行长时间的讨论
共 (0) 个答案