Confusão: @NotNull vs @Column (nullable = false)

  1. Quando eles aparecem em um campo / getter de um @Entity , qual é a diferença entre eles? (Eu persisto a Entidade através do Hibernate ).

  2. Qual estrutura e / ou especificação cada um deles pertence?

  3. @NotNull está localizado em javax.validation.constraints . No javadoc javax.validation.constraints.NotNull diz

    O elemento anotado não deve ser nulo

    mas não fala da representação do elemento no database, então por que eu adicionaria a restrição nullable=false à coluna?

@NotNull é uma anotação JSR 303 Bean Validation . Não tem nada a ver com as restrições do database. Como o Hibernate é a implementação de referência do JSR 303, no entanto, ele capta de maneira inteligente essas restrições e as traduz em restrições de database para você, de modo que você obtém dois pelo preço de um. @Column(nullable = false) é o modo JPA de declarar que uma coluna não é nula. Ou seja, o primeiro destina-se à validação e o segundo, para indicar detalhes do esquema do database. Você está apenas recebendo alguma ajuda extra (e bem-vinda!) Do Hibernate nas annotations de validação.

As versões mais recentes do provedor JPA do hibernate aplicam as restrições de validação do bean (JSR 303) como @NotNull para DDL por padrão (graças aos padrões de hibernate.validator.apply_to_ddl property para true ). Mas não há garantia de que outros provedores de JPA façam ou até tenham a capacidade de fazer isso.

Você deve usar annotations de validação de beans como @NotNull para garantir que as propriedades do bean sejam definidas como um valor nulo nulo ao validar beans java na JVM (isso não tem nada a ver com restrições de database, mas na maioria das situações deve corresponder a elas) .

Você também deve usar a anotação JPA como @Column(nullable = false) para fornecer as dicas do provedor jpa para gerar o DDL correto para criar colunas de tabela com as restrições de database desejadas. Se você pode ou quer confiar em um provedor JPA como o Hibernate, que aplica as restrições de validação do bean ao DDL por padrão, você pode omití-las.

Interessante notar que todas as fonts enfatizam que @Column (nullable = false) é usado somente para geração de DDL.

No entanto, mesmo se não houver nenhuma anotação @NotNull, e a opção hibernate.check_nullability estiver configurada como true, o Hibernate executará a validação de entidades a serem persistidas.

Ele lançará PropertyValueException dizendo que “a propriedade não nula faz referência a um valor nulo ou transitório”, se nullable = atributos falsos não possuem valores, mesmo que tais restrições não sejam implementadas na camada do database.

Mais informações sobre a opção hibernate.check_nullability estão disponíveis aqui: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping .