2012-10-10 51 views
11

我想用來存儲birthdate所以我在MySQL的選擇date,當我以我的數據庫中創建我的實體,事實證明這樣的:Bean驗證約束(S)違反:「prePersist」

import java.util.Date; 

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

但是當我嘗試堅持它給了我這個錯誤:

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

什麼我錯在這裏做什麼? 我正在閱讀一些關於谷歌定義時區的內容,我來自巴西,我應該怎麼做?

編輯

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

你的實體代碼中是否有@PrePersist?如果是這樣,請將其粘貼在 – Marthin

+0

@Marthin不,我沒有它。 –

+0

這是很煩人的例外,因爲我從來沒有用'Date'之前的任何問題.. –

回答

5

我做了什麼來解決我的問題是顛倒順序@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; 

我不知道爲什麼會這樣才能事這麼多,但它=] 謝謝大家!

+5

這不是一個正確的答案。 – vels4j

+0

我剛剛遇到同樣的問題,這篇文章幫助了我!我解決了它刪除'@ NotNull'並將'nullable = false'放在'@ Column'中。 – codyLine

4

錯誤顯示您正試圖堅持實體未能 數據庫約束,所以嘗試確定要插入的確切值到數據庫中,你居然插入之前。

並嘗試通過評論/省略@NotNull註釋。

+0

這是我怎麼寫我的形式數據庫:'用戶[ID = NULL,出生日期=日09月29日21:00:00 BRT 1985年,[email protected],性別= M,圖像= NULL,名稱=瓦爾特,密碼= afSQtkcfmikK2G7CLfcL4RJewIGB10oe' –

+0

仍同樣的例外 –

+0

什麼是你的主要關鍵是它的ID? – Swarne27

26

我得到了同樣的問題,但經過尋找答案小時,終於讓我找到它....您應該編輯您的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); 
    } 
} 

現在此方法會提醒您哪些屬性以及驗證失敗的原因。 我希望這對你有用,就像它對我一樣。

+0

這應該是公認的答案! –

+0

我在哪裏可以找到AbstractFacade.java類?我應該上新班嗎? – LeDerp

3

當然,Iomanip的回答是完全正確的!我只是稍微擴展了一下。也許這也有幫助:

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

感謝您的代碼,它完美的工作。我想方法名中有一個輸入錯誤:'constraintValidationsDetected' - >'constraintViolationsDetected' – Micer

+0

工作正常,直到你必須刪除。它會在合併和刪除之間的循環中導致StackOverflowError。我必須禁用remove方法才能使其工作。 – javydreamercsw

1

當我試圖堅持一個實體時,我花了幾個小時掙扎着這個錯誤。

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)NOT NULL,

1

我有類似的問題。在我的情況下,參考PK和FK的大小不同(見示例)。

實體A:實體B

實體B的

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

fk_b引用ID字段:

id VARCHAR2(4 CHAR) 
... 

ID是這裏PK。

注ID()和FK_B的尺寸()。將B的ID更改爲5 CHAR錯誤消失。

6

我得到了一個快捷方式,抓住以下異常,你堅持的實體。在我的情況下,它在EJB添加方法。我在哪裏做em.persist()。然後檢查服務器日誌,您將看到哪些屬性約束違規。

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

謝謝,它的工作原理! – Garrizano

+0

沒問題。快樂的編碼。 –