为什么Bean验证器在不可为空但自动生成的id字段上抛出ConstraintViolationException?

问题描述:

实体类:为什么Bean验证器在不可为空但自动生成的id字段上抛出ConstraintViolationException?

public class MyUser implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "id") 
    private Integer id; 


    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 100) 
    @Column(name = "name") 
    private String name; 

    // other attrs and getter-setters 


    public MyUser() { 
    } 

    public MyUser(Integer id) { 
     this.id = id; 
    } 

    public MyUser(Integer id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

使用码:

MyUser myuser = new MyUser(); 
myuser.setName("abc"); 

try { 
    em.persist(myuser); 
} catch (ConstraintViolationException e) { 
    System.out.println("size : " + e.getConstraintViolations().size()); 
    ConstraintViolation<?> violation = e.getConstraintViolations().iterator().next(); 
    System.out.println("field : " + violation.getPropertyPath().toString()); 
    System.out.println("type : " + violation.getConstraintDescriptor().getAnnotation().annotationType()); 
} 

OUTPUT:

INFO: size : 1 
INFO: field : id 
INFO: type : interface javax.validation.constraints.NotNull 

环境:

JDK 6个U23
GlassFish应用服务器版3.1-B41(有豆validator.jar)
NetBeans IDE的7.0 Beta 2的

问题:

有没有人有关于为什么是豆验证就扔这个异常的建议不可空,但自动生成的ID字段?什么是正确的Approuch?

使用IDENTITY生成时,首先将实体插入到具有空标识符的数据库中,然后执行查询以获取生成的ID的值。因此,在插入时,您的ID为空,因此违反了NotNull约束。

+0

那么成功通过bean验证的正确方法是什么?用临时/虚拟值设置Id域不是我认为的适当方法。 – 2011-04-01 14:52:19