Похоже, я больше не буду заниматься этим вопросом, поэтому я опубликую свою работу и оставлю это на этом.Ряд поисковых запросов не нашел ничего полезного.Я бы подумал, что это случай из учебника, но ни один из найденных мной уроков не охватывает его.
Как выясняется в этом условии с EclipseLink, исключение, которое вы можете поймать при нарушении ограничения SQL, это RollBackException , который является результатом вызова em.commit () .Поэтому я изменил свой постоянный метод следующим образом:
public void persist(Category category) throws EntityExistsException {
try {
utx.begin();
em.persist(category);
utx.commit();
} catch (RollbackException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
throw new EntityExistsException(ex);
} catch (HeuristicMixedException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (HeuristicRollbackException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalStateException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (NotSupportedException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (SystemException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
}
}
Так что вызывающая сторона перехватывает EntityExistsException и предпринимает соответствующее действие.Журнал по-прежнему заполняется внутренними исключениями, но его можно отключить позже.
Я понимаю, что это немного злоупотребляет намерением EntityExistsException , которое обычно используется толькокогда поле идентификатора сущности используется повторно, но для целей пользовательского приложения это не имеет значения.
Если у кого-то есть лучший подход, пожалуйста, оставьте новый ответ или комментарий.