Java Persistence / JPA: @Column vs @Basic

119

Was ist der Unterschied zwischen @Columnund @BasicAnmerkungen in JPA? Können sie zusammen verwendet werden? Sollten sie zusammen verwendet werden? Oder reicht einer von ihnen aus?

Hosam Aly
quelle

Antworten:

147
  • @Basicbedeutet, dass ein Attribut beibehalten und eine Standardzuordnung verwendet werden soll. Es verfügt über Parameter, mit denen Sie angeben können, ob das Attribut träge geladen werden soll und ob es nullwertfähig ist.

  • @Column Mit dieser Option können Sie den Namen der Spalte in der Datenbank angeben, für die das Attribut beibehalten werden soll.

Wenn Sie eines ohne das andere angeben, erhalten Sie ein vernünftiges Standardverhalten. Daher verwenden die Benutzer mit Ausnahme von Sonderfällen häufig nur eines.

Wenn wir also ein Attribut verzögert laden und einen Spaltennamen angeben möchten, können wir sagen

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Wenn wir das standardmäßige, nicht faule Verhalten benötigen @Columnwürden, wäre nur das ausreichend gewesen.

djna
quelle
2
Dies ist eine klare Antwort. Danke dir. Ich gehe also davon aus, dass man @Basicohne verwenden kann @Column, weshalb die Eigenschaften optionalund nullablein beiden existieren. Habe ich recht?
Hosam Aly
1
Ich behaupte nicht, die JPA-Spezifikation in Bezug auf die Unterschiede zwischen nullable von @ Basic und nullable von @ Column und den Effekt der Angabe von keinem, einem oder beiden vollständig zu verstehen. @Basic nullable wird als "Hinweis" mit Relevanz für die Schemaerstellung beschrieben. @Column nullable wird als Definition der Merkmale der Spalte in der Datenbank beschrieben. Meine Praxis wäre es, den @ Column-Fall zu verwenden.
DJNA
16
@Basic (optional) wird (sollte) zur Laufzeit vom Persistenzanbieter überprüft, bevor es in der Datenbank gespeichert wird. @Column ist eine Spaltendefinition in der Datenbank und wird für die Schemaerstellung
Piotr Gwiazda
2
das "nicht faul", nennt EAGER. LOL
Solvator
7
Die JPA-Annotationen können in zwei Gruppen unterteilt werden: die reinen relationalen Annotationen im Vergleich zu den Implementierungsanmerkungen. Die reinen relationalen Annotationen enthalten: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... während die Implementierungsanmerkungen Hinweise dazu geben, wie das reine theoretische Modell einer realen Datenbank zugeordnet werden kann: Tabelle, Spalte, ... In Ihrer Frage 'Basic 'ist eine Anmerkung, die Informationen zum Attribut der relationalen Entität bereitstellt, während' Column 'Informationen zum Zuordnen zu einer Datenbankspalte enthält.
Bruno Ranschaert
50

Zusätzlich zu der Antwort von @ djna ist anzumerken, dass @Basicmit und verglichen werden @OneToManysollte . Für eine Eigenschaft kann nur eine davon angegeben werden.@ManyToOne@ManyToMany

@Columnund @JoinColumnkann zusammen mit diesen angegeben werden, um die Eigenschaften der Datenbankspalte zu beschreiben.

Dies sind zwei Sätze von Anmerkungen, die zusammen verwendet werden können, es kann jedoch jeweils nur eine Anmerkung von jedem Satz verwendet werden.

Hosam Aly
quelle
21

Es ist erwähnenswert, dass Basic für primitive Felder ausgelegt ist

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Ein Basisattribut ist ein Attribut, bei dem die Attributklasse ein einfacher Typ ist, z. B. String, Number, Date oder ein Grundelement. Der Wert eines Basisattributs kann direkt dem Spaltenwert in der Datenbank zugeordnet werden.

Die unterstützten Typen und Konvertierungen hängen von der JPA-Implementierung und der Datenbankplattform ab. Jedes grundlegende Attribut, das einen Typ verwendet, der keinem Datenbanktyp direkt zugeordnet ist, kann einem binären Datenbanktyp serialisiert werden.

Der einfachste Weg, ein grundlegendes Attribut in JPA zuzuordnen, besteht darin, nichts zu tun. Alle Attribute, die keine anderen Anmerkungen haben und nicht auf andere Entitäten verweisen, werden automatisch als Basis zugeordnet und sogar serialisiert, wenn sie kein Basistyp sind. Der Spaltenname für das Attribut wird standardmäßig mit dem gleichen Namen wie der Attributname in Großbuchstaben angegeben.

Gab
quelle
Gute Notiz. Danke dir.
Hosam Aly
1
Nein, wenn keine Spaltenanmerkung angegeben ist, gelten die Standardwerte (Name ist das Attribut Eins).
Gab
2

Die Annotation @Basic wird auf JPA-Entitäten angewendet, und die Annotation @Column wird auf die Datenbankspalten angewendet. Das optionale Attribut der Annotation @Basic definiert, ob das Entitätsfeld null sein kann oder nicht. andererseits,

  • Das nullable-Attribut der @ Column-Annotation gibt an, ob die entsprechende Datenbankspalte null sein kann
  • Wir können @Basic verwenden, um anzugeben, dass ein Feld träge geladen werden soll
  • Mit der Annotation @Column können wir den Namen der zugeordneten Datenbankspalte angeben
  • Die Annotation @Basic markiert die Eigenschaft auf Java-Objektebene als nicht optional. Und (nullable = false) in der Spaltenzuordnung ist nur für die Generierung einer NOT NULL-Datenbankbeschränkung verantwortlich.
Sonu Patel
quelle