catch ConstraintViolationException — не работает

#java #hibernate #exception

#java #спящий режим #исключение

Вопрос:

Я не могу поймать ConstraintViolationException

 public BigDecimal createSubBoard(SubBoard subBoardObj, Users user) {
    EntityManager em = EMFUtility.getEntityManager();     
    EntityTransaction et = null; 
    SubBoards subBoard = null;
    SubBoard subBoards = null;
    Boards board = null;
    BigDecimal subBoardId = new BigDecimal(0);
    try {
        logger.debug(" #### BoardsDao - createSubBoard" subBoardObj.toString());
        et = em.getTransaction();
        et.begin();

        try{
        subBoardObj.setCreateDate(new Date());
        subBoardObj.setCreatedBy(user.getEdipi());
        em.persist(subBoardObj);
        subBoardId = subBoardObj.getId();
        et.commit();
        } catch(EJBTransactionRolledbackException  ce) {
            System.out.println("!!!");
            Throwable t = ce.getCause();
                while ((t != null) amp;amp; !(t instanceof ConstraintViolationException)) {
                    t = t.getCause();
                }
                if (t instanceof ConstraintViolationException) {
                    System.out.println("...........");
                    // Check here if the delete date is also null
                }
        }   

        ///TODO..///    
        
    } catch (Exception e) {
        et.rollback();
        e.printStackTrace();
        System.out.println("!!!! " e.getCause() );
        logger.debug(" #### BoardsDao - createSubBoard :Exception is "   e.getMessage());
        throw new PersistenceException("Error persisting entity in createSubBoard "  e.getMessage());
    } finally {
        em.close();
    } 
    return subBoardId;
}
  

в этом коде em.persist(subBoardObj); вызывает ConstraintViolationException. Я попытался использовать getCause() и определить, является ли ConstraintViolation, но элемент управления кодом не получает этот блок catch. Он переходит в общий блок исключений. Может кто-нибудь подсказать, что не так.

Ответ №1:

Прежде всего, я бы не рекомендовал выполнять обработку транзакций вручную, а вместо этого использовать декларативное управление транзакциями. Если вы используете EJBS, вам просто нужно аннотировать компонент как @Stateless или, если вы хотите изменить стратегию демакрации транзакции, используйте @TransactionAttribute аннотацию к методу. Если вам действительно необходимо использовать ручное управление транзакциями, вы должны использовать UserTransaction интерфейс. Это связано с тем, что EJB работает со спецификацией JTA, которую вы, вероятно, также настроили как стратегию транзакций в вашем модуле сохранения.

Сказав это, EntityManager.persist и EntityManager.flush выбросьте javax.persistence.PersistenceException этот wrap a org.hibernate.exception.ConstraintViolationException . Итак, вам нужно перехватить PersistenceException, а затем использовать getCause для получения нарушения ограничения.