2016-09-16 4 views
0

Я не уверен, что я спрашиваю его правильно, но у меня есть метод, который является транзакционным, и в этом я получаю список элементов. Теперь, обрабатывая один из элементов, я сталкиваюсь с недопустимым исключением использования данных. [Null передается в репозиторий, и штраф один выдает это исключение, и это нормально), и после получения этого исключения я его поймаю и отмечаю, что элемент обработанный «сбой». Транзакционный метод заканчивается, но изменения не проходят.Весна JPA - сущность отсоединена? на исключениях?

@Transactional 
public void method(){  
    try{ 
    List items = itemRepo.getItems(NOT_SUBMITTED); 
    for(Item item: items){ 
     processItem(item); //this is where the exception happens 
    } 
    } 
    catch(Exception e){ 
    item.setStatus(FAILED) // this doesn't go through to the db 
    } 
} 

private void processItem(Item item){ 
    otherRepo.findOne(item.X); //item.X is null, and I get "invalid data usage" exception 
} 

Я думаю, что объект как-то отделяется; не знаю почему. Я сделал тест, выбрав исключение самостоятельно в блоке try, работал отлично. Статус был правильно отражен.

Я попытался захватить этот объект снова, сделав itemRepo.findOne (item) .setState (FAILED), не сработал. Я пробовал, itemRepo.save (item) - не работал.

Любые указатели?

Благодаря

+1

Это не должно даже компилироваться. 'item' находится вне области действия в блоке catch. – digitaljoel

+0

Пожалуйста, отформатируйте код - его трудно прочитать. Кроме того, показать трассировку стека - из описания это не ясно - это findOne(), который генерирует исключение? –

+0

, потому что этот код не компилируется, это не тот код, который вы используете, я думаю, что проблема в том, что исключение (это исключение во время выполнения) и оставляют метод аннотированным с помощью @Transactional, а те же весенние роли ist bal – Ralph

ответ

0

Исключение броска реализации JPA, который также устанавливает статус транзакции в setRollbackOnly. Вот почему вы можете сохранить неудавшееся состояние, когда оно выбрасывает исключение.

После того, как сущностьManager JPA выбрасывает исключение, это делается, вы больше не можете использовать этот entityManager. Сохранение статуса элемента как сбой должно быть в отдельной транзакции с использованием другого экземпляра entityManager.

+0

Хорошо, но я думал, что до тех пор, пока исключение не выйдет из метода, который является транзакционным, возвращается ли JPA кадр назад. Есть ли выход здесь? Я бы тоже хотел обработать исключения JPA? – karansardana

+0

Просто прочитайте что-нибудь об этом; Я понимаю это сейчас. Благодарю. – karansardana

Смежные вопросы