使用 Spring Data JPA 我在同一个事务中有下一个流程(REQUIRES_NEW):
@Query(value = "DELETE FROM TRespuestaUsuarioPrediccion resp WHERE resp.idEvento.id = :eventId AND resp.idUsuario.id = :userId")
@Modifying
void deleteUserPredictions(@Param("userId") int userId, @Param("eventId") int eventId);
eventRepository.save(event);
当这个服务完成时,提交是由 AOP 进行的,但只在第一次尝试中起作用……而不是在下一次……
如何在不迭代事件的预测条目并更新内部的每个条目的情况下管理这种情况?
更新
我试过了,但它不起作用(适配器插入了我之前删除的对象):
@Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor=PlayTheGuruException.class)
private void updateUserPredictions(final TUsuario user, final TEvento event, final SubmitParticipationRequestDTO eventParticipationRequestDTO)
{
eventRepository.deleteUserPredictions(user.getId(), event.getId());
EventAdapter.predictionParticipationDto2Model(user, event, eventParticipationRequestDTO);
eventRepository.save(event);
}
请您参考如下方法:
Hibernate 更改了命令的顺序。它按以下顺序工作:
以特殊顺序执行所有 SQL 和二级缓存更新,以便不会违反外键约束:
1. Inserts, in the order they were performed
2. Updates
3. Deletion of collection elements
4. Insertion of collection elements
5. Deletes, in the order they were performed
情况正是如此。刷新时,Hibernate 在删除语句之前执行所有插入。
可能的选择是:
1. 在删除后显式调用 entityManager.flush()。
或者
2. 尽可能更新现有行并从其余行创建 ToBeDeleted 列表。这将确保使用新值更新现有记录并保存全新的记录。