Могу ли я исправить использование своей транзакции после @transactionaleventlistener (phase = transactionphase.after_commit) и сохранить мою сущность в разных таблицах. И почему, если я оставлю распространение транзакции = необходимо. Я получу ошибку org.springframework.dao.invaliddataaccessapiusageexception: Транзакция не находится. И когда я устанавливаю @Transactional (TransactionAl.txtype.requires_new), это не получает ошибки < /p>
@Aspect
@Component
@RequiredArgsConstructor
public class AspectOffsettingRepository {
private final ApplicationEventPublisher publisher;
private static final String STATUS_FOR_MESSAGE = "REGISTERED";
@AfterReturning(
pointcut = "execution(* ru.sbrf.sbererp.dzkz.register.service.repository.impl.OffsettingJpaRepository.save(..))",
returning = "result"
)
public void afterSave(OffsettingEntity result) {
handleAfterSave(result);
}
@AfterReturning(
pointcut = "execution(* ru.sbrf.sbererp.dzkz.register.service.repository.impl.OffsettingJpaRepository.saveAndFlush(..))",
returning = "result"
)
public void afterSaveAndFlush(OffsettingEntity result) {
handleAfterSave(result);
}
private void handleAfterSave(OffsettingEntity entity) {
if (entity.getStatus() != null && STATUS_FOR_MESSAGE.equals(entity.getStatus())) {
publisher.publishEvent(new OffsettingRegisteredEvent(
entity.getOffsetId(),
entity.getCreatedBy(),
entity.getFirstPartnerId().toString()
));
}
}
< /code>
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void postSave(OffsettingRegisteredEvent event) {
offsettingOutboxService.createMessageToRo(event);
}
< /code>
@Slf4j
@Service
@RequiredArgsConstructor
public class OffsettingOutboxService {
private final OffsettingDebtDao offsettingDebtDao;
private final OffsettingDao offsettingDao;
private final DebtService debtService;
private final OutboxContentBuilder outboxBuilder;
private final OutboxService outboxService;
private final MdmGateway mdmGateway;
private static final String OFFSETTING_STATUS = "GLA_CONFIRMATION";
@Transactional(Transactional.TxType.REQUIRES_NEW)
public void createMessageToRo(OffsettingRegisteredEvent event) {
List pairsDebtId = findPairsDebtId(event.offsetId());
EmployeeInfo employeeInfo = mdmGateway.findEmployeeInfo(event.createdBy());
Map debtMap = findDebts(pairsDebtId);
Map employeeInfoCache = new HashMap();
boolean isRegisterFilled = false;
for (PairOffsettingDebtIds pair : pairsDebtId) {
DebtModel firstDebt = debtMap.get(pair.getFirstDebtId());
DebtModel secondDebt = debtMap.get(pair.getSecondDebtId());
if (firstDebt == null || secondDebt == null) {
continue;
}
EmployeeInfo firstEmployeeInfo = employeeInfoCache.computeIfAbsent(
firstDebt.getCreatedBy(), mdmGateway::findEmployeeInfo);
EmployeeInfo secondEmployeeInfo = employeeInfoCache.computeIfAbsent(
secondDebt.getCreatedBy(), mdmGateway::findEmployeeInfo);
boolean fillRegisterForThisPair = !isRegisterFilled && Boolean.TRUE.equals(secondDebt.getIsRegisterCreator());
OutboxRegisterOfOperationContent registerOfOperationContent = createRegisterOfOperationContent(
OutboxRegisterOfOperationContentDto.builder()
.debtFirstSide(firstDebt)
.debtSecondSide(secondDebt)
.serviceOriginatorDepartment(event.partnerId())
.userName(employeeInfo.fio())
.debtFirstSideEmployeeInfo(firstEmployeeInfo)
.debtSecondSideEmployeeInfo(secondEmployeeInfo)
.debtFirstSideBeginDate(getRelationBeginDate(firstDebt.getRegister().getAccountingPartnerId().toString()))
.debtSecondSideBeginDate(getRelationBeginDate(secondDebt.getRegister().getAccountingPartnerId().toString()))
.isRegisterFill(fillRegisterForThisPair)
.build()
);
outboxService.save(outboxBuilder.buildOutbox(registerOfOperationContent, fillRegisterForThisPair));
if (fillRegisterForThisPair) {
isRegisterFilled = true;
}
}
OffsettingEntity offsettingEntity = offsettingDao.findByOffsetId(event.offsetId());
offsettingEntity.setStatus(OFFSETTING_STATUS);
offsettingDao.save(offsettingEntity);
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ublish-sav