是否有人对如何在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 REST不考虑实体,而是考虑聚合。聚合是来自域驱动设计的一个术语,它描述了一组实体,某些业务规则适用于这些实体。以订单项及其订单项旁边的订单为例,该业务规则定义了需要达到的最低订单价值。
我不确定我是否正确理解了您的问题,但我会尝试一下。