Confusione: @NotNull vs @Column (nullable = false)

  1. Quando appaiono su un campo / getter di @Entity , qual è la differenza tra loro? (Persino l’Entità attraverso Hibernate ).

  2. Quale struttura e / o specifica a ciascuna di esse appartiene?

  3. @NotNull si trova all’interno di javax.validation.constraints . Nel javax.validation.constraints.NotNull javadoc dice

    L’elemento annotato non deve essere nullo

    ma non parla della rappresentazione dell’elemento nel database, quindi perché dovrei aggiungere il vincolo nullable=false alla colonna?

@NotNull è un’annotazione di convalida Bean JSR 303 . Non ha nulla a che fare con i vincoli del database stesso. Poiché Hibernate è l’implementazione di riferimento di JSR 303, tuttavia, prende intelligentemente su questi vincoli e li traduce in vincoli di database per te, quindi ne ottieni due al prezzo di uno. @Column(nullable = false) è il modo JPA di dichiarare una colonna non-null. Il primo è inteso per la convalida e il secondo per indicare i dettagli dello schema del database. Stai solo ricevendo un aiuto extra (e benvenuto!) Da Hibernate sulle annotazioni di validazione.

Le versioni più recenti del provider JPA di ibernazione applicano i limiti di convalida del bean (JSR 303) come @NotNull a DDL per impostazione predefinita (grazie alla hibernate.validator.apply_to_ddl property @NotNull su true ). Ma non vi è alcuna garanzia che altri fornitori JPA abbiano o abbiano la capacità di farlo.

È necessario utilizzare annotazioni di convalida del bean come @NotNull per garantire che le proprietà bean siano impostate su un valore null-null, durante la convalida dei bean java nella JVM (ciò non ha nulla a che fare con i vincoli del database, ma nella maggior parte delle situazioni dovrebbe corrispondere a essi) .

Si dovrebbe inoltre utilizzare l’annotazione JPA come @Column(nullable = false) per fornire al provider jpa suggerimenti per generare il DDL corretto per la creazione di colonne di tabella con i vincoli del database desiderati. Se si può o si vuole fare affidamento su un provider JPA come Hibernate, che applica i vincoli di convalida del bean a DDL per impostazione predefinita, è ansible ometterli.

È interessante notare che tutte le fonti sottolineano che @Column (nullable = false) viene utilizzato solo per la generazione DDL.

Tuttavia, anche se non c’è annotazione @NotNull e l’opzione hibernate.check_nullability è impostata su true, Hibernate eseguirà la convalida delle quadro da mantenere.

Lanciare PropertyValueException dicendo che “la proprietà not-null fa riferimento a un valore null o transitorio”, se nullable = gli attributi falsi non hanno valori, anche se tali restrizioni non sono implementate nel livello del database.

Ulteriori informazioni sull’opzione hibernate.check_nullability sono disponibili qui: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping .