23

保存したいbirthdateので、MySQLで選択dateしました。データベースに基づいてエンティティを作成すると、次のようになります。

import java.util.Date;

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

しかし、永続化しようとすると、次のエラーが発生します。

コールバックイベントで自動BeanValidationを実行しているときにBeanValidation制約に違反しました:'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 + "]");
    }



}
4

7 に答える 7

38

私は同じ問題を抱えていましたが、何時間も答えを探した後、ついに見つけました.... 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);
    }
}

このメソッドは、どのプロパティと、検証に失敗した理由を警告します。私と同じように、これがあなたにとってもうまくいくことを願っています。

于 2014-06-05T21:43:08.973 に答える
6

このエラーは、永続化しようとしているエンティティがデータベースの制約に違反していることを示しているため、実際に挿入する前に、データベースに挿入する正確な値を確認してください。

注釈をコメント/省略して試してみてください@NotNull

于 2012-10-11T05:48:06.147 に答える
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;

なぜこの順序がこれほど重要なのかはわかりませんが、そうです =] みんなありがとう!

于 2012-10-16T11:39:28.237 に答える
5

もちろん、イオマニプの答えは完全に正しいです! 少しだけ延長しました。たぶんこれも役立ちます:

  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));
    }
  }
于 2014-11-08T13:24:41.813 に答える
2

エンティティを永続化しようとしているときに、このエラーに数時間苦労しました。

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;

そして、DataBase 列の定義:

jpaDiscriminatorVARCHAR(15) NOT NULL、

于 2014-12-02T16:46:09.803 に答える
2

同様の問題がありました。私の場合、参照される PK と FK のサイズが異なっていました (例を参照)。

エンティティ A:

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

fk_b エンティティ B の ID フィールドを参照

エンティティ B:

id VARCHAR2(4 CHAR)
...

id はここでは PK でした。

ID( 4 ) と FK_B( 5 ) のサイズに注意してください。B の ID を5 CHARに変更すると、エラーはなくなりました。

于 2016-12-15T10:18:24.583 に答える