2015-05-05 2 views
2

простой проблема. Вот код:попробуйте поймать сохранение исключение

public void insertDefacer(Defacer defacer) { 
    try { 
     em.persist(defacer); 
    } catch (PersistenceException | DatabaseException e) { 
     defacer = em.find(Defacer.class, defacer.getIdentity()); 
     defacer.setStats(defacer.getStats() + 1); 
     em.merge(defacer); 
    } 
} 

когда defacer уже существует в базе данных (MySQL), то persist операция генерирует исключение (PersistenceException и/или DatabaseException). Кажется, это нормально. Поэтому я хочу поймать эти исключения и угрожать им. Но после регистрации этих исключений моя программа заканчивается внезапно (без завершения метода).

Почему?

Detail (Это может быть важным или нет): эм является EntityManager пройти через @PersistenceContext

+0

где вы ссылаетесь на метод финиша? –

+0

Я хочу, чтобы мой захват работал. Но это не так. – Aucxence

+1

Я подозреваю, что в вашем блоке 'catch' происходит другое' Exception'. Обычно ваша программа должна продолжать работать, поэтому, вероятно, что-то происходит с вашим «EntityManager», чтобы предотвратить это. –

ответ

0

Вы пытаетесь таким образом, чтобы получить EntityManager?

@PersistenceContext 
private EntityManager em; 

public EntityManager getEntityManager() { 
return em; 
} 

public void setEntityManager(EntityManager em) { 
this.em = em; 
} 
+0

Я не понимаю, почему вы думаете, что ** при получении EntityManager ** все будет по-другому? Мне нужно объяснение. – Aucxence

0

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

public void insertDefacer(Defacer defacer) { 
    EntityTransaction tx = null; 
    try { 
     tx = em.getTransaction(); 
     tx.begin(); 
     em.persist(defacer); 
     tx.commit(); 
    } catch (Exception ex) { 
     if(tx != null && tx.isActive()) tx.rollback(); 
    } finally { 
     em.close(); 
    } 
} 
+0

если *** упорствует работает ***, ваш код выполнит *** слияние ***. Я не хочу этого. – Aucxence

0

Я нашел альтернативу. Просто увидеть код:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void insertDefacer(Defacer defacer) { 

    Defacer df = em.find(Defacer.class, defacer.getIdentity()); 
    if(df == null) { 
     em.persist(defacer); 
     System.out.println("Save"); 
    } else { 
     em.merge(defacer); 
     System.out.println("Update"); 
    } 

}

Как я сказал Это паллиативное решение. Спасибо за вашу помощь.

0

Убедитесь, что этот параметр PersistenceExcionion относится к пакету спящего режима.

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