javax.validation.ConstraintViolationException: ограничения проверки компонента нарушены при проверке перед обновлением

#model-view-controller #spring #jpa

#model-view-controller #spring #jpa

Вопрос:

У меня появляется раздражающее сообщение об ошибке при попытке вставить новый элемент в отношения «многие ко многим», используя JPA 2.0, SpringMVC 3.0.

У меня есть таблица с состояниями, а другая — с лицами. Пользователь может быть связан со многими состояниями, а состояние — со многими лицами. В данном конкретном случае у меня есть listOfStates, а затем person, и я хотел бы вставить эти элементы в мои отношения «многие ко многим».

Множество взаимосвязей (в состоянии таблицы)

     //bi-directional many-to-many association to Appointment
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
name="PERSON_STATE"
, joinColumns={
    @JoinColumn(name="PERSON_ID", nullable=false)
    }
, inverseJoinColumns={
    @JoinColumn(name="CODE_STATE", nullable=false)
    }
)
  

Код DAO, КОТОРЫЙ я вызываю со своего контроллера

 try{    
    getEntityManager().getTransaction().begin();            
    getEntityManager().persist(myPerson);                       

    IStateDAO stateDAO = new StateDAO();

    for (int i=0; i<listOfStates.length; i  ){
        State myState = stateDAO.findState(listOfStates[i]);
        if (myState != null){                   
            myState.getPersons().add(myPerson);
            getEntityManager().persist(myState);
        }
    }

    getEntityManager().getTransaction().commit();           
    getEntityManager().close();         

} catch (RuntimeException re) {
    getEntityManager().close();
    throw re;           
}
  

Забавно то, что этот код работает нормально, когда я не вставляю данные с веб-страницы. Что я здесь делаю не так? У меня уже есть некоторые лица и состояния в базе данных.

Сообщение об ошибке полного стека:

 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.


javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.
  

Любой указатель был бы действительно оценен. Заранее всем вам спасибо.

Ответ №1:

вау! понял! Мне пришлось изменить режим проверки в моем persistence.xml от Auto до NONE, что в основном указывает приложению вообще не использовать проверку компонента. Сообщения об ошибках исчезли, и мой DAO работает хорошо.

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

1. но отключение проверки не решает суть проблемы, оно просто игнорирует ее.

2. Спасибо за это. Но если вы можете подробнее изучить это, почему проверка была проблемой. Пожалуйста, поделитесь здесь.

Ответ №2:

В исключениях указано, что используется проверка компонента JSR 303 и настроен режим гибернации (Persistence.xml ) чтобы проверить их перед обновлением чего-либо.

Проверка компонента JSR 303 представляет собой аннотации, подобные:

  • javax.validation.constraints.NotNull
  • javax.validation.constraints.Size

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

1. Спасибо за ваш ответ. Я действительно использую аннотации Hibernate validator на уровне класса для проверки моих классов при привязке их к форме. Но для этого конкретного класса я не указал никаких ограничений, что заставляет меня думать, что это больше похоже на внутреннюю вещь. я не уверен, куда теперь идти.

2. пользователь659580: В исключении не указано, что нарушение ограничения связано с классом Person!

3. но исключение возникает, когда я пытаюсь сбросить или зафиксировать Person даже сразу после операции сохранения.

4. @user659580 и больше ничего не загружается и не изменяется?

5. Существуют ли какие-либо ограничения проверки компонента в вашем графе объектов? Нет ли дополнительной информации в журнале? Где-то должен быть зарегистрирован путь к ошибке. Это даст вам представление о том, какое ограничение для какого объекта завершилось с ошибкой.