如何在Spring Data REST中的同一事务中处理多个实体更新

问题描述 投票:0回答:2

是否有人对如何在Spring Data REST中的同一事务中处理多个实体更新有任何想法?在Spring控制器方法中,可以使用@Transactional批注处理同一件事。如果我是正确的,Spring Data REST将在单独的事务中执行每个执行事件。因此无法以适当方式处理多个实体更新。

我在更新同一事务内的2个实体(ABC和PQR)并在PQR实体发生故障时回滚ABC实体时遇到问题。

// ABC repository
    @RepositoryRestResource
    public interface ABCEntityRepository extends MongoRepository<ABC, String> {
    }

// PQR repository
    @RepositoryRestResource
    public interface PQREntityRepository extends MongoRepository<PQR, String> {
    }

// ABC repository handler
    @RepositoryEventHandler
    public class ABCEventHandler {

        @Autowired
        private PQREntityRepository pqrEntityRepository;


        @HandleBeforeSave
        public void handleABCBeforeSave(ABC abc) {
          log.debug("before saving ABC...");
        }

        @HandleAfterSave
        public void handleABCAfterSave(ABC abc) {
          List<PQR> pqrList = pqrEntityRepository.findById(abc.getPqrId());

          if (pqrList != null && !pqrList.isEmpty()) {
            pqrList.forEach(pqr -> {
              // update PQR objects
            }
          }

          // expect to fail this transaction
          pqrEntityRepository.saveAll(pqrList);
        }
    }

由于@HandleAfterSave方法是在单独的事务中执行的,因此调用HandleAfterSave方法意味着ABC实体更新已完成,因此无法回滚。有什么建议可以解决吗?

spring-data-mongodb spring-data-rest
2个回答
0
投票

Spring Data REST不考虑实体,而是考虑聚合。聚合是来自域驱动设计的一个术语,它描述了一组实体,某些业务规则适用于这些实体。以订单项及其订单项旁边的订单为例,该业务规则定义了需要达到的最低订单价值。


0
投票

我不确定我是否正确理解了您的问题,但我会尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.