Ограничения проверки компонентов нарушены при выполнении автоматической проверки компонентов в событии обратного вызова: «prePersist»

Я хотел бы сохранить birthdate, поэтому я выбрал date в MySQL, когда я создаю свои сущности на основе своей базы данных, получается так:

import java.util.Date;

    // ..code
    @NotNull(message="fill you birthdate")
    @Temporal(TemporalType.DATE)
    private Date birthdate;

Но когда я пытаюсь сохраниться, это дает мне эту ошибку:

Ограничения проверки компонентов нарушены при выполнении автоматической проверки компонентов в событии обратного вызова: «prePersist». Подробности см. во встроенных ConstraintViolations.

Что я здесь делаю неправильно? Я читал что-то об определении часового пояса в Google, я из Бразилии, как мне это сделать?

ИЗМЕНИТЬ

package entity;

import java.io.Serializable;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

import java.util.Date;
import java.util.List;


/**
 * The persistent class for the user database table.
 * 
 */
@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Temporal(TemporalType.DATE)
    private Date birthdate;

    @NotNull(message="informe seu e-mail")
    @Email(message="e-mail inválido")
    private String email;

    @NotNull(message="informe seu gênero")
    private String gender;

    private String image;

    @NotNull(message="informe seu nome completo")
    private String name;

    @Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos")
    @NotNull(message="informe sua senha")
    private String password;

    //bi-directional many-to-one association to Document
    @OneToMany(mappedBy="user")
    private List<Document> documents;

    //bi-directional many-to-one association to QuestionQuery
    @OneToMany(mappedBy="user")
    private List<QuestionQuery> questionQueries;

    //bi-directional many-to-one association to Team
    @OneToMany(mappedBy="user")
    private List<Team> teams;

    public User() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getBirthdate() {
        return this.birthdate;
    }

    public void setBirthdate(Date birthdate) {
        this.birthdate = birthdate;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return this.gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getImage() {
        return this.image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Document> getDocuments() {
        return this.documents;
    }

    public void setDocuments(List<Document> documents) {
        this.documents = documents;
    }

    public List<QuestionQuery> getQuestionQueries() {
        return this.questionQueries;
    }

    public void setQuestionQueries(List<QuestionQuery> questionQueries) {
        this.questionQueries = questionQueries;
    }

    public List<Team> getTeams() {
        return this.teams;
    }

    public void setTeams(List<Team> teams) {
        this.teams = teams;
    }

    public void print() {
        System.out.println("User [id=" + id + ", birthdate=" + birthdate + ", email="
                + email + ", gender=" + gender + ", image=" + image + ", name="
                + name + ", password=" + password + "]");
    }



}

person Valter Silva    schedule 10.10.2012    source источник
comment
у вас есть @PrePersist в коде вашей сущности? Если это так, пожалуйста, вставьте его также   -  person Marthin    schedule 10.10.2012
comment
это очень раздражающее исключение, потому что раньше у меня никогда не было проблем с Date..   -  person Valter Silva    schedule 10.10.2012
comment
Это довольно общая ошибка, она может возникнуть из-за ошибок проверки в каком-то другом поле вашей модели. Мой обычный подход: включить ведение журнала SQL и параметров (просто для EclipseLink, но я думаю, что большинство поставщиков JPA поддерживают его) или выполнить попытку/поймать em.flush() (чтобы принудительно выполнить фиксацию вместо ожидания фиксации контейнера) и зациклить ConstraintViolations, чтобы найти проблему.   -  person Tasos P.    schedule 11.10.2012
comment
Чтобы получить более точные ответы от пользователей JPA, укажите реализацию/версию JPA, поставщика/версию сервера БД и используемую версию драйвера JDBC. Первым шагом будет попытка отключить проверку бина в persistence.xml с помощью <property name="javax.persistence.validation.mode" value="none" />   -  person BalusC    schedule 11.10.2012


Ответы (7)


У меня возникла та же проблема, но после нескольких часов поиска ответа, наконец, я нашел его.... Вам следует отредактировать свой класс AbstractFacade.java и добавить этот код

public void create(T entity) {

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
    if(constraintViolations.size() > 0){
        Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
        while(iterator.hasNext()){
            ConstraintViolation<T> cv = iterator.next();
            System.err.println(cv.getRootBeanClass().getName()+"."+cv.getPropertyPath() + " " +cv.getMessage());

            JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName()+"."+cv.getPropertyPath() + " " +cv.getMessage());
        }
    }else{
        getEntityManager().persist(entity);
    }
}

Теперь этот метод сообщит вам, какое свойство и почему оно не проходит проверку. Я надеюсь, что это работает для вас, как и для меня.

person Iomanip    schedule 05.06.2014
comment
Где я могу найти класс AbstractFacade.java? Должен ли я создать новый класс? - person LeDerp; 01.02.2018

У меня есть короткий путь, поймайте следующее исключение, когда вы сохраняете сущность. В моем случае это метод добавления EJB. где я делаю em.persist(). Затем проверьте журнал сервера, вы увидите, какой атрибут имеет нарушение ограничения.

catch (ConstraintViolationException e) {
       log.log(Level.SEVERE,"Exception: ");
       e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString()));
    }
person Ahmed Raaj    schedule 25.04.2017

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

и попробуйте также прокомментировать/опустить аннотацию @NotNull.

person Swarne27    schedule 11.10.2012
comment
Вот как я пишу свою форму в базе данных:User [id=null, birthdate=Sun Sep 29 21:00:00 BRT 1985, [email protected], gender=M, image=null, name=valter, password=afSQtkcfmikK2G7CLfcL4RJewIGB10oe - person Valter Silva; 11.10.2012
comment
еще с тем же исключением - person Valter Silva; 11.10.2012
comment
каков ваш первичный ключ? - person Swarne27; 11.10.2012
comment
если ваш первичный ключ - это идентификатор, почему вы установили его равным нулю - person Swarne27; 11.10.2012
comment
id не может быть нулевым, попробуйте выяснить, почему он нулевой? - person Swarne27; 11.10.2012
comment
Извините за задержку с ответом, но теперь я нашел проблему, это мое ограничение здесь: @Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos") @NotNull(message="informe sua senha") private String password; - person Valter Silva; 16.10.2012
comment
чтобы решить проблему, мне просто нужно было инвертировать позицию проверки @NotNull с проверкой @Size, вот и все, ребята. Спасибо. - person Valter Silva; 16.10.2012

Что я сделал, чтобы решить свою проблему, так это инвертировать порядок @Size и @NotNull

до:

@Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos")
@NotNull(message="informe sua senha")
private String password;

после:

@NotNull(message="informe sua senha")
@Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos")
private String password;

Я не знаю, почему этот заказ так важен, но он имеет значение =] Всем спасибо!

person Valter Silva    schedule 16.10.2012
comment
Я только что столкнулся с той же проблемой, и этот пост помог мне! Я решил это, удалив @NotNull и поместив nullable = false в @Column. - person codyLine; 21.07.2017

Конечно, ответ Иоманипа совершенно правильный! Я просто немного расширил его. Может быть, это тоже поможет:

  private boolean constraintValidationsDetected(T entity) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
    if (constraintViolations.size() > 0) {
      Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
      while (iterator.hasNext()) {
        ConstraintViolation<T> cv = iterator.next();
        System.err.println(cv.getRootBeanClass().getName() + "." + cv.getPropertyPath() + " " + cv.getMessage());

        JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName() + "." + cv.getPropertyPath() + " " + cv.getMessage());
      }
      return true;
    }
    else {
      return false;
    }
  }

  public void create(T entity) {
    if (!constraintValidationsDetected(entity)) {
      getEntityManager().persist(entity);
    }
  }

  public T edit(T entity) {
    if (!constraintValidationsDetected(entity)) {
      return getEntityManager().merge(entity);
    }
    else {
      return entity;
    }
  }

  public void remove(T entity) {
    if (!constraintValidationsDetected(entity)) {
      getEntityManager().remove(getEntityManager().merge(entity));
    }
  }
person mpunktw    schedule 08.11.2014
comment
Спасибо за код, все работает. Я предполагаю, что в названии метода опечатка: constraintValidationsDetected -> constraintViolationsDetected - person Micer; 09.03.2015
comment
Работает нормально, пока не придется удалять. Это вызывает StackOverflowError в цикле между слиянием и удалением. Мне пришлось отключить метод удаления, чтобы он работал. - person javydreamercsw; 05.05.2015

Я потратил несколько часов на борьбу с этой ошибкой, пока пытался сохранить сущность.

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

Это сообщение об ошибке бесполезно, довольно запутанно...

В любом случае в моем случае причиной ошибки была разница между аннотацией в Enity

@Size(min = 1, max = 10)
@Column(name = Utilizator.JPA_DISCRIMINATOR)
private String jpaDiscriminator;

И определение столбца базы данных:

jpaDiscriminator VARCHAR(15) НЕ NULL,

person razvang    schedule 02.12.2014

У меня была аналогичная проблема. В моем случае размеры указанных ПК и ФК различались (см. пример).

Объект А:

some_pk   INTEGER NOT NULL,
fk_b      VARCHAR2(5 CHAR)
...

fk_b ссылается на поле идентификатора объекта B

Объект Б:

id VARCHAR2(4 CHAR)
...

id был здесь PK.

Обратите внимание на размеры ID(4) и FK_B(5). После изменения идентификатора B на 5 CHAR ошибка исчезла.

person thomasso    schedule 15.12.2016