使用 Spring Data JPA 我在同一个事务中有下一个流程(REQUIRES_NEW):

  • 使用此 Spring Data JPA 存储库方法删除一组用户的预测。
    @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 列表。这将确保使用新值更新现有记录并保存全新的记录。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!