Как обработать org.hibernate.exception.ConstraintViolationException, я использую try catch, но это не работает

#mysql #spring #hibernate #rest

#mysql #spring #спящий режим #остальное

Вопрос:

Этот метод предназначен для сохранения данных в базе данных

 public Response saveAll(PurchaseOrderHeaderDto purchaseOrderHeaderDto){
    try{
        s=sf.openSession();
        tx=s.beginTransaction();
        PurchaseOrderHeader orderDo=importDao(purchaseOrderHeaderDto);
        for(int i=0;i<orderDo.getPurchaseItemList().size(); i  ){
            orderDo.getPurchaseItemList().get(i).setHeaderDetails(orderDo);
            s.save(orderDo.getPurchaseItemList().get(i));
        }
        response.setStatus(200);
        response.setMessage("succesfull");
        tx.commit();

    }
    catch(ConstraintViolationException  e){
    System.out.println(e.getMessage());
        response.setStatus(500);
        response.setMessage("unsuccesfull");
        tx.rollback();

    }
    finally{
        s.close();
    }
    return response;
}
  

I am getting this error

  Error during managed flush [org.hibernate.exception.DataException: could not execute statement]
  

Я не понимаю, как обработать это исключение (я знаю, что это из-за длины, но я хочу обработать это исключение. Любые предложения приветствуются)

Ответ №1:

потому что вы пытаетесь перехватить, ConstraintViolationException пока получаете DataException . Попробуйте использовать приведенный ниже код:

 public Response saveAll(PurchaseOrderHeaderDto purchaseOrderHeaderDto) {
    try {
        s = sf.openSession();
        tx = s.beginTransaction();
        PurchaseOrderHeader orderDo = importDao(purchaseOrderHeaderDto);
        for (int i = 0; i < orderDo.getPurchaseItemList().size(); i  ) {
            orderDo.getPurchaseItemList().get(i).setHeaderDetails(orderDo);
            s.save(orderDo.getPurchaseItemList().get(i));
        }
        response.setStatus(200);
        response.setMessage("succesfull");
        tx.commit();

    } catch (Exception e) {
        System.out.println(e.getMessage());
        response.setStatus(500);
        response.setMessage("unsuccesfull");
        tx.rollback();

    } finally {
        s.close();
    }
    return response;
}
  

это будет перехватывать каждое исключение, возможно, вы захотите поработать над этим позже, но это должно сработать

Комментарии:

1. ну, это сработает, но я хочу перехватить столбец, который вызывает ошибку … как мне это сделать … любые предложения приветствуются

2. не будет, ConstraintViolationException поскольку Hibernate используется только DataException по этой причине