Почему валидатор Бина создает исключение ConstraintViolationException для не обнуляемого, а автоматически сгенерированного поля id? - PullRequest
3 голосов
/ 31 марта 2011

ENTITY CLASS:

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 с открытым исходным кодом, версия 3.1-b41 (содержит bean-validator.jar)
IDE NetBeans 7.0 Beta 2

ВОПРОС:

Есть ли у кого-нибудь предложения по поводу того, почему валидатор Бина создает это исключение в не обнуляемом, а автоматически генерируемом поле идентификатора?Какой правильный подход?

1 Ответ

2 голосов
/ 31 марта 2011

При генерации IDENTITY сущность сначала вставляется в базу данных с нулевым идентификатором, а затем выполняется запрос для получения значения сгенерированного идентификатора.Таким образом, во время вставки ваш идентификатор имеет значение NULL и, таким образом, нарушает ограничение NotNull.

...