2012-10-10 27 views
11

Me gustaría almacenar birthdate así que elegí date en MySQL, cuando creo mis entidades basadas en mi base de datos, resulta así :Restricciones de validación de beans violadas al ejecutar Automatic Validación de beans en el evento de devolución de llamada: 'prePersist'

import java.util.Date; 

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

Pero cuando trato de persistir me da este error:

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

¿qué estoy haciendo mal aquí? Estaba leyendo algo sobre definir la zona horaria en Google, soy de Brasil, ¿cómo debería hacerlo?

EDITAR

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 + "]"); 
    } 



} 
+0

¿Tiene usted un @PrePersist en su código de entidad? Si es así, pégalo también en – Marthin

+0

@Marthin no, yo no lo tengo. –

+0

esta es una excepción muy molesta, porque nunca tuve ningún problema con 'Fecha' antes .. –

Respuesta

5

Lo que hice para resolver mi problema era invertir el orden @Size y @NotNull

antes:

@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; 

después:

@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; 

No sé por qué este asunto fin tanto, pero lo hace =] ¡Gracias a todos!

+5

Esta no es una respuesta correcta. – vels4j

+0

¡Acabo de encontrar el mismo problema y esta publicación me ayudó! Lo resolví quitando '@ NotNull' y puse' nullable = false' en '@ Column'. – codyLine

4

El error muestra que la entidad que está tratando de persistir está fallando limitaciones de bases de datos, a fin de tratar de determinar los valores exactos que está insertando en la base de datos antes de que realmente inserta.

y prueba comentando/omitiendo @NotNull anotación también.

+0

Así escribo mi formulario en base de datos: 'Usuario [id = nulo, fecha de nacimiento = Dom 29 de septiembre 21:00:00 BRT 1985, [email protected], género = M, imagen = nulo, nombre = validad, contraseña = afSQtkcfmikK2G7CLfcL4RJewIGB10oe' –

+0

todavía con la misma excepción –

+0

¿cuál es su clave principal es id? – Swarne27

26

que tiene el mismo problema, pero después de horas buscando la respuesta, Finalmente lo encontré .... debería editar su AbstractFacade.java clase y añadir este código

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); 
    } 
} 

Ahora este método le avisará qué propiedad y por qué no valida la validación. Espero que esto funcione para usted, como lo hace para mí.

+0

¡esta debería ser la respuesta aceptada! –

+0

¿Dónde puedo encontrar la clase AbstractFacade.java? ¿Debo hacer una nueva clase? – LeDerp

3

Por supuesto, la respuesta de Iomanip es completamente correcta. Lo extendí un poco. Tal vez esto ayude también:

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)); 
    } 
    } 
+0

Gracias por el código, funciona perfectamente. Supongo que hay un error tipográfico en el nombre del método: 'constraintValidationsDetected' ->' constraintViolationsDetected' – Micer

+0

Funciona bien hasta que tenga que eliminar. Provoca StackOverflowError en un ciclo entre merge y remove. Tuve que deshabilitar el método de eliminar para que funcione. – javydreamercsw

1

Pasé unas horas luchando con este error mientras intentaba persistir a una entidad.

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

Este mensaje de error no es útil, bastante confuso ...

De todas formas, en mi caso la causa del error era - una diferencia entre la anotación en Enity

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

Y la definición de columna de datos:

jpaDiscriminator VARCHAR (15) NOT NULL,

1

Tuve un problema similar. En mi caso, los tamaños de PK referenciados y el FK diferían (ver ejemplo).

entidad A:

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

fk_b campo ID de referencia de la entidad B

entidad B:

id VARCHAR2(4 CHAR) 
... 

Identificación estuvo aquí una PK.

Nota los tamaños de ID() y FK_B(). Después de cambiar la ID de B a 5 CHAR, el error se ha ido.

6

Tengo un acceso directo, Catch la siguiente excepción donde persiste la entidad. En mi caso, está en el método de agregar EJB. donde estoy haciendo em.persist(). Luego verifique el registro del servidor, verá qué atributo tiene restricción de violación.

catch (ConstraintViolationException e) { 
     log.log(Level.SEVERE,"Exception: "); 
     e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString())); 
    } 
+0

¡Gracias, funciona! – Garrizano

+0

no hay problema. feliz codificacion –

Cuestiones relacionadas