Могу ли я работать с базой данных в другой транзакции после, когда мой аспект публикует сусбранную сущность. И мой ListnJAVA

Программисты JAVA общаются здесь
Anonymous
Могу ли я работать с базой данных в другой транзакции после, когда мой аспект публикует сусбранную сущность. И мой Listn

Сообщение Anonymous »

Могу ли я исправить использование своей транзакции после @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

Вернуться в «JAVA»