2015-03-24 3 views
0

Я запускаю определенный процесс, который вставляет новые элементы в БД из цикла for. Я использую JPA (Eclipselink), и иногда возникает проблема с состоянием трансации. Это тот случай:Обработка исключений JPA

  1. Один из INSERTS не работает (первичный ключ дублируется)
  2. После этого, все вставки потерпит неудачу (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()? промывать()? Закрыть()?

Какой из них выглядит лучше? Спасибо!

+1

Почему вы не отказываетесь от транзакции в ответ на исключение? –

+0

'EntityManager.getTransaction()' возвращает объект EntityTransaction. Убедитесь, что вы либо «commit()», либо «rollback()» для этого объекта транзакции. – dhke

+0

Вы используете JPA, но для встроенных SQL-вставок .. почему бы не использовать Entities непосредственно для вставок? Вы также используете 1 вставку на транзакцию, есть ли причина, по которой вы не используете новый экземпляр EntityManager, когда вы получаете исключение? – Chris

ответ

2

Исключение, вызванное ElementManager.Query, не отменяет активную транзакцию. Здесь я вижу два варианта:

  1. Откат транзакции самостоятельно в рамках улова с использованием em.getTransaction().rollback().
  2. Вместо того, чтобы вставлять данные с запросом, используйте способ, основанный на EntityManager.persist, исключения которого вызывают автоматический откат (в вашем конкретном случае это приведет к javax.persistence.EntityExistsException).