@Basic (optional = false) vs @Column (nullable = false) in JPA

103

Was ist der Unterschied zwischen @Basic(optional = false)und @Column(nullable = false)in der JPA-Persistenz?

Joaosavio
quelle
1
duplicate stackoverflow.com/questions/1383229/…
Schildmeijer
14
Nicht wirklich ein Duplikat, die Frage bezieht sich mehr auf die Attribute, nicht auf die Anmerkungen.
Pascal Thivent
Vielleicht
Sonu Patel

Antworten:

98

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 optionalund nullableist 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, optionalsollten 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.

Pascal Thivent
quelle
8
Also, was sollte wirklich verwendet werden, vielleicht beides?
Xiè Jìléi
39
@Xie Jilei: Aus dem Buch: Java-Persistenz mit Ruhezustand 2007, p. 179: @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.
Rapt
2
@rapt - Ich verstehe nicht 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 @Basicman sagen, dass die Datenbankspalte NOT NULLfür diese Variable erstellt wird?
Erran Morad
9
Wenn Sie versuchen, eine Entität mit einem Nullfeld beizubehalten, wird eine Ausnahme ausgelöst, wenn sie als optional = false markiert ist (ohne Kontakt mit der Datenbank aufzunehmen) und die Entität nicht zum JPA-Persistenzkontext hinzugefügt wird. Wenn nur annotiert wird, dass nullable = false ist, wird die Entität zum Persistenzkontext hinzugefügt, und beim Versuch, die Entität in die Datenbank zu schreiben (z. B. über Flush), wird versucht, die Entität in die Datenbank zu schreiben, wodurch dies und verweigert werden es wird dann eine Ausnahme auslösen.
Ray Hulha
@RayHulha Ich habe versucht, ein Feld mit "@Basic (optional = false)" zu versehen, und ich habe der Datenbank ein Tupel hinzugefügt (mit dem Wert dieses Felds = null). Es wurde keine Ausnahme ausgelöst !!, ich hoffe, Sie können es erklären für mich dieses Verhalten.
ziMtyth
4

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.)

Ray Hulha
quelle
1
Es ist lustig, dass die andere Antwort impliziert, dass dies nullbar ist und nicht Basic, das für die Schemaerstellung verwendet wird (wenn es heißt, dass "nullable" nur in Bezug auf Datenbankspalten steht »). Es ist immer noch sehr verwirrend. Ich denke, nullable wird für die Schemaerstellung verwendet und Basic (optional = false) kann für denselben Zweck verwendet werden. Ist das sinnvoll?
Marcus
optional = falsedient nur zur Überprüfung dieser Einschränkung zur Laufzeit. nullable = falseErstellt eine Datenbankbeschränkung. Für Anwendungen optional = falseist das
Festlegen