#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
для получения нарушения ограничения.