Was ist der Unterschied zwischen @Basic(optional = false)
und @Column(nullable = false)
in der JPA-Persistenz?
Was ist der Unterschied zwischen @Basic(optional = false)
und @Column(nullable = false)
in der JPA-Persistenz?
Antworten:
Gordon Yorke (Mitglied des EclipseLink-Architekturausschusses, technischer Leiter von TopLink Core, Mitglied der JPA 2.0-Expertengruppe) hat eine gute Antwort zu diesem Thema geschrieben. Anstatt ihn zu paraphrasieren, zitiere ich seine Antwort :
Der Unterschied zwischen
optional
undnullable
ist der Umfang, in dem sie bewertet werden. Die Definition von 'optional
' spricht über Eigenschafts- und Feldwerte und schlägt vor, dass diese Funktion zur Laufzeit ausgewertet werden sollte. 'nullable
' bezieht sich nur auf Datenbankspalten.Wenn sich eine Implementierung für die Implementierung entscheidet,
optional
sollten diese Eigenschaften vom Persistenzanbieter im Speicher ausgewertet und eine Ausnahme ausgelöst werden, bevor SQL an die Datenbank gesendet wird. Andernfalls werden bei Verwendung von 'updatable=false
' 'optional
' - Verstößen niemals gemeldet.
@Basic(optional = false) @Column(nullable = false)
Die Annotation @Basic markiert die Eigenschaft auf Java-Objektebene als nicht optional. Die zweite Einstellung, nullable = false in der Spaltenzuordnung, ist nur für die Generierung einer NOT NULL-Datenbankeinschränkung verantwortlich. In der JPA-Implementierung für den Ruhezustand werden beide Optionen in jedem Fall gleich behandelt. Sie können daher auch nur eine der Anmerkungen für diesen Zweck verwenden.
The @Basic annotation marks the property as not optional on the Java object level.
Was bedeutet das? Ist es also nur so, als würde @Basic
man sagen, dass die Datenbankspalte NOT NULL
für diese Variable erstellt wird?
Also habe ich die Annotation @Basic (optional = false) mit JPA 2.1 (EclipseLink) ausprobiert und es stellte sich heraus, dass die Annotation bei der tatsächlichen Verwendung ignoriert wird (zumindest für ein String-Feld). (zB entityManager.persist-Aufrufe).
Also ging ich zur Spezifikation und las darüber nach. Die Spezifikation hat Folgendes zu sagen:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Grundlegend (optional): Gibt an, ob der Wert des Felds oder der Eigenschaft null sein darf. Dies ist ein Hinweis und wird für primitive Typen nicht berücksichtigt. Es kann bei der Schemaerstellung verwendet werden.
Ich denke, dieser Satz erklärt den tatsächlichen Anwendungsfall für Basic (optional), das bei der Schemaerstellung verwendet wird. (Das heißt: Wenn Sie CREATE TABLE SQL aus Java Entity-Klassen generieren. Dies kann Hibernate beispielsweise tun.)
optional = false
dient nur zur Überprüfung dieser Einschränkung zur Laufzeit. nullable = false
Erstellt eine Datenbankbeschränkung. Für Anwendungen optional = false
ist das