Я запускаю определенный процесс, который вставляет новые элементы в БД из цикла for. Я использую JPA (Eclipselink), и иногда возникает проблема с состоянием трансации. Это тот случай:Обработка исключений JPA
- Один из INSERTS не работает (первичный ключ дублируется)
После этого, все вставки потерпит неудачу (Exception Описание: Транзакция активна в данный момент).
for (Element l:e){ try{ //Should I add: if(!em.getTransaction().isActive()) em.getTransaction().begin(); em.createNativeQuery("INSERT INTO...").executeUpdate(); em.getTransaction().commit(); } catch(Exception ep) { //right now I don't do anything here } }
Я понимаю, что то, что происходит в том, что, так как обязательство в 1) не работает, то сделка не закончил, так что следующий em.getTransaction(). Начать () найдет уже активную транзакцию.
У меня есть две идеи:
A) Перед em.getTransaction() начать(), проверьте, если передам активен, и только если это не так, обратитесь начать();. в противном случае создайте запрос и зафиксируйте.
B) Сделайте что-нибудь внутри блока catch. И вот мое сомнение ... Должен ли я назвать clear()? промывать()? Закрыть()?
Какой из них выглядит лучше? Спасибо!
Почему вы не отказываетесь от транзакции в ответ на исключение? –
'EntityManager.getTransaction()' возвращает объект EntityTransaction. Убедитесь, что вы либо «commit()», либо «rollback()» для этого объекта транзакции. – dhke
Вы используете JPA, но для встроенных SQL-вставок .. почему бы не использовать Entities непосредственно для вставок? Вы также используете 1 вставку на транзакцию, есть ли причина, по которой вы не используете новый экземпляр EntityManager, когда вы получаете исключение? – Chris