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

标签 jpa jakarta-ee glassfish-3 bean-validation

实体类:

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

输出:

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

环境:

JDK 6 u23
GlassFish Server 开源版 3.1-b41(有 bean-validator.jar)
NetBeans IDE 7.0 测试版 2

问题:

有没有人对为什么 Bean 验证器在不可空但自动生成的 id 字段上抛出此异常有任何建议?什么是正确的做法?

最佳答案

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

关于jpa - 为什么 Bean 验证器在不可为空但自动生成的 id 字段上抛出 ConstraintViolationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5497841/

相关文章:

java - 避免 Java/Servlet Web 堆栈中的 IllegalStateException

java - 计划任务执行两次

java - 在 EJB Web 服务的构造函数中抛出异常

jpa - EclipseLink native 查询结果到 POJO - [Class] 缺少描述符

java - 未找到查询异常的实体

java - 从 JSP 到 Servlet 的动态更新字段获取数据

java - GlassFish:使用 --force 进行部署

java - 在同一事务方法中使用 CriteriaBuilder JPA 插入和更新会出现错误 "Foreign Key not exist"

java - 是否可以在 jpa 中调用不调用 setter 的情况下更新实体

Servlet - 是否使用构造函数?