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.
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).
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.)
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
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 :
quelle
@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 DatenbankspalteNOT 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/
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.)
quelle
optional = false
dient nur zur Überprüfung dieser Einschränkung zur Laufzeit.nullable = false
Erstellt eine Datenbankbeschränkung. Für Anwendungenoptional = false
ist das