Контекст транзакции не распространяется на транзакцию, запущенную новым потоком Spring Data JpaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Контекст транзакции не распространяется на транзакцию, запущенную новым потоком Spring Data Jpa

Сообщение Anonymous »

У меня есть метод, аннотированный @Transactional, этот метод сохраняет объект и создает цикл for, затем для каждого цикла он передает сохраненный объект методу @Async, чтобы сохранить дочерний элемент сущность, основанная на этом. Основной метод просто заканчивается, когда все потоки завершены. Пример ниже

Код: Выделить всё

@Transactional
private void mainMethod(Persisted entity,Param params){
List processList = new ArrayList();
for(Item item:params.getData().getItems()){
CompletableFuture process =  produtosPedidoProcessor.asyncPersistance(entity,item);
processList.add(process);
}
CompletableFuture allProcesses = CompletableFuture.allOf(processList.toArray(new CompletableFuture[0]));
allProcesses.join();
}
А затем асинхронный метод

Код: Выделить всё

@Async("someThreadPool")
public CompletableFuture asyncPersistance(Persisted entity,Item item){
//massive api call
someRepository.save(childEntity);
return CompletableFuture.completedFuture(null);
}
Проблема в том, что когда я сохраняю дочерний объект, он выдает мне ошибку внешнего ключа, например, основной объект не был сохранен. Ясно, что контекст транзакции не распространяется между этими потоками.
Проблема в том, что когда я сохраняю дочерний объект, он выдает мне ошибку внешнего ключа, например, основной объект не был сохранен.
Проблема в том, что когда я сохраняю дочерний объект, он выдает мне ошибку внешнего ключа, например, основной объект не был сохранен. p>
Как я могу обработать async + transcational в этом примере, чтобы устранить эту ошибку?
Что я пробовал:
Я удалил постоянство из потока и вернул завершенное будущее, содержащее неперсонифицированное состояние дочернего объекта, чтобы затем сохранить его в thenApply:

Код: Выделить всё

    process.thenApply(result -> {
someRepository.save(childEntity);
return null;
}).exceptionally(
e->{
return null;
}
);
Но исключения всегда срабатывают, вызывая ошибку внешнего ключа.

Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-sprin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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