wake-up-neo.com

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

  1. Was ist der Unterschied zwischen ihnen, wenn sie auf einem Feld/Getter eines @Entity Erscheinen? (Ich behalte die Entität durch Ruhezustand).

  2. Welchem ​​Framework und/oder welcher Spezifikation gehört jeder von ihnen an?

  3. @NotNull Befindet sich innerhalb von javax.validation.constraints. Im Javadoc javax.validation.constraints.NotNull Steht

    Das mit Annotationen versehene Element darf nicht null sein

    aber es spricht nicht von der Darstellung des Elements in der Datenbank. Warum sollte ich der Spalte die Einschränkung nullable=false hinzufügen?

219
rapt

@NotNull ist eine JSR 303 Bean Validation Annotation. Es hat nichts mit Datenbankeinschränkungen selbst zu tun. Da Hibernate die Referenzimplementierung von JSR 303 ist, werden diese Einschränkungen auf intelligente Weise aufgegriffen und in Datenbankeinschränkungen für Sie übersetzt, sodass Sie zwei zum Preis von einer erhalten. @Column(nullable = false) ist die JPA-Methode, mit der eine Spalte als nicht null deklariert wird. Das heißt Ersteres dient zur Validierung und Letzteres zur Angabe von Details zum Datenbankschema. Sie erhalten nur zusätzliche (und willkommene!) Hilfe von Hibernate zu den Validierungsanmerkungen.

301
Ryan Stewart

Die neuesten Versionen des JPA-Providers für den Ruhezustand wenden die Bean-Validierungsbeschränkungen (JSR 303) wie @NotNull Standardmäßig auf DDL an (dank hibernate.validator.apply_to_ddl property Standardmäßig auf true). Es gibt jedoch keine Garantie dafür, dass andere JPA-Anbieter dies tun oder sogar tun können.

Sie sollten Bean-Validierungs-Annotationen wie @NotNull Verwenden, um sicherzustellen, dass die Bean-Eigenschaften bei der Validierung von Java Beans in der JVM) auf einen Wert ohne Null gesetzt werden (dies hat nichts zu tun mit Datenbankeinschränkungen, aber in den meisten Situationen sollten sie entsprechen).

Sie sollten zusätzlich die JPA-Annotation wie @Column(nullable = false) verwenden, um dem jpa-Anbieter Hinweise zum Generieren der richtigen DDL zum Erstellen von Tabellenspalten mit den gewünschten Datenbankeinschränkungen zu geben. Wenn Sie sich auf einen JPA-Anbieter wie Hibernate verlassen können oder möchten, der die Bean-Validierungsbeschränkungen standardmäßig auf DDL anwendet, können Sie sie weglassen.

12
Sebastian Theek

Interessanterweise wird in allen Quellen betont, dass @Column (nullable = false) nur für die DDL-Generierung verwendet wird.

Selbst wenn keine @NotNull-Annotation vorhanden ist und die Option hibernate.check_nullability auf true gesetzt ist, führt Hibernate eine Validierung von Entitäten durch, die beibehalten werden sollen.

Es wird eine PropertyValueException ausgelöst, die besagt, dass "die Eigenschaft not-null auf einen Nullwert oder einen vorübergehenden Wert verweist", wenn die Attribute nullable = false keine Werte haben, selbst wenn solche Einschränkungen nicht in der Datenbankebene implementiert sind.

Weitere Informationen zur Option hibernate.check_nullability finden Sie hier: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping .