Je voudrais stocker birthdate
alors j'ai choisi date
dans MySQL, lorsque je crée mes entités basées sur ma base de données, cela se présente comme suit:
import Java.util.Date;
// ..code
@NotNull(message="fill you birthdate")
@Temporal(TemporalType.DATE)
private Date birthdate;
Mais quand j'essaie de persister, cela me donne cette erreur:
Contrainte (s) de validation de bean violée (s) lors de l'exécution de la validation automatique de bean sur un événement de rappel: 'prePersist'. Veuillez vous référer à ConstraintViolations intégré pour plus de détails.
Qu'est-ce que je fais de mal ici? .__ Je lisais quelque chose sur la définition du fuseau horaire dans Google, je viens du Brésil, comment dois-je procéder?
MODIFIER
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 + "]");
}
}
Ce que j'ai fait pour résoudre mon problème a été d'inverser l'ordre @Size
et @NotNull
avant:
@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;
aprè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;
Je ne sais pas pourquoi cet ordre est aussi important, mais c'est le cas =] Merci à tous!
J'ai eu le même problème, mais après des heures à chercher la réponse, enfin je l'ai trouvé .... Vous devez modifier votreAbstractFacade.Javaclass et ajouter ce code
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);
}
}
Maintenant, cette méthode vous alertera quelle propriété et pourquoi il échoue la validation. J'espère que cela fonctionne pour vous, comme pour moi.
J'ai un moyen de raccourci, Catch l'exception suivante où vous persistez l'entité. Dans mon cas, c'est dans la méthode EJB add. où je fais em.persist()
. Ensuite, vérifiez le journal du serveur, vous verrez quel attribut ayant contraint violation.
catch (ConstraintViolationException e) {
log.log(Level.SEVERE,"Exception: ");
e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString()));
}
L'erreur indique que l'entité que vous essayez de conserver échoue Avec des contraintes de base de données. Essayez donc de déterminer les valeurs exactes que vous insérez dans la base de données avant de les insérer.
et essayez aussi en commentant/en supprimant l'annotation @NotNull
.
Bien sûr, la réponse de Iomanip est tout à fait juste! Je viens de prolonger un peu. Peut-être que cela aide aussi:
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));
}
}
J'ai eu le même problème. Dans mon cas, les tailles de PK et de FK référencées étaient différentes (voir exemple).
Entité A:
some_pk INTEGER NOT NULL,
fk_b VARCHAR2(5 CHAR)
...
fk_b champ d'ID référencé de l'entité B
Entité B:
id VARCHAR2(4 CHAR)
...
id était ici un PK.
Notez les tailles de ID ( 4 ) et FK_B ( 5 ). Après avoir changé l’ID de B en 5 CHAR l’erreur a disparu.
J'ai passé quelques heures à lutter contre cette erreur pendant que j'essayais de conserver une entité.
Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.
Ce message d'erreur n'est pas utile, c'est assez déroutant ...
En tout cas, dans mon cas, la cause de l’erreur était - une différence entre une annotation dans Enity
@Size(min = 1, max = 10)
@Column(name = Utilizator.JPA_DISCRIMINATOR)
private String jpaDiscriminator;
Et la définition de la colonne DataBase:
jpaDiscriminator
VARCHAR (15) NOT NULL,