Persistenza Java / JPA: @Column vs @Basic


119

Qual è la differenza tra @Columne @Basicannotazioni in JPA? Possono essere usati insieme? Dovrebbero essere usati insieme? O uno di loro è sufficiente?

Risposte:


147
  • @Basicsignifica che un attributo deve essere mantenuto e deve essere utilizzata una mappatura standard. Dispone di parametri che consentono di specificare se l'attributo deve essere caricato in modo lento e se è annullabile.

  • @Column consente di specificare il nome della colonna nel database in cui l'attributo deve essere mantenuto.

Se ne specifichi uno senza l'altro, ottieni un comportamento predefinito che è sensato, quindi comunemente le persone ne usano solo uno ad eccezione di casi speciali.

Quindi, se volessimo caricare un attributo e specificare un nome di colonna, possiamo dirlo

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

Se avessimo bisogno del comportamento predefinito, non pigro, @Columnsarebbe stato sufficiente.


2
Questa è una risposta chiara. Grazie. Quindi presumo che si possa usare @Basicsenza @Column, motivo per cui le proprietà optionale nullableesistono in entrambi. Ho ragione?
Hosam Aly,

1
Non pretendo di comprendere appieno la specifica JPA sulle differenze tra nullable di @ Basic e nullable di @ Column e l'effetto di non specificare nessuno dei due o entrambi. @Basic nullable è descritto come un "suggerimento" con rilevanza per la generazione di schemi. @Column nullable viene descritto come la definizione delle caratteristiche della colonna nel database. La mia pratica consiste nell'usare il caso @Column.
djna

16
@Basic (opzionale) è (dovrebbe essere) controllato in runtime dal provider di persistenza prima di salvare nel DB. @Column è una definizione di colonna nel database e viene utilizzata per la generazione dello schema: stackoverflow.com/questions/2899073/…
Piotr Gwiazda

2
che "non pigro", chiama EAGER. LOL
solvator

7
Le annotazioni JPA possono essere divise in due gruppi: le annotazioni relazionali pure rispetto alle annotazioni di implementazione. Le annotazioni relazionali pure contengono: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... mentre le annotazioni di implementazione danno indizi su come mappare il modello teorico puro a un database reale: Tabella, Colonna, ... Nella tua domanda 'Base 'è un'annotazione per fornire informazioni sull'attributo dell'entità relazionale mentre' Colonna 'fornisce informazioni su come mapparlo a una colonna del database.
Bruno Ranschaert

50

Oltre alla risposta di @ djna , vale la pena notare che @Basicdovrebbe essere confrontata con @OneToMany, @ManyToOnee @ManyToMany. Solo uno di questi può essere specificato su qualsiasi proprietà.

@Columne @JoinColumnpuò essere specificato insieme a uno qualsiasi di questi per descrivere le proprietà della colonna del database.

Si tratta di due serie di annotazioni che possono essere utilizzate insieme, ma è possibile utilizzare solo un'annotazione di ciascuna serie alla volta.


21

Vale la pena notare che Basic è progettato per campi primitivi

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

Un attributo di base è quello in cui la classe dell'attributo è un tipo semplice come String, Number, Date o una primitiva. Il valore di un attributo di base può essere mappato direttamente al valore della colonna nel database.

I tipi e le conversioni supportati dipendono dall'implementazione JPA e dalla piattaforma del database. Qualsiasi attributo di base che utilizza un tipo che non esegue il mapping direttamente a un tipo di database può essere serializzato in un tipo di database binario.

Il modo più semplice per mappare un attributo di base in JPA è non fare nulla. Qualsiasi attributo che non ha altre annotazioni e non fa riferimento ad altre entità verrà automaticamente mappato come base e persino serializzato se non un tipo di base. Il nome della colonna per l'attributo verrà impostato per impostazione predefinita, con lo stesso nome dell'attributo, come maiuscolo.


Buona nota. Grazie.
Hosam Aly

1
No, se non viene specificata alcuna annotazione di colonna, vengono applicati i valori predefiniti (il nome sarà quello dell'attributo).
Gab

2

L'annotazione @Basic viene applicata alle entità JPA e il valore di @Column viene applicato alle colonne del database L'attributo opzionale dell'annotazione @Basic definisce se il campo dell'entità può essere nullo o meno; d'altro canto,

  • L'attributo nullable dell'annotazione @Column specifica se la colonna del database corrispondente può essere nulla
  • Possiamo usare @Basic per indicare che un campo deve essere caricato pigramente
  • L'annotazione @Column ci consente di specificare il nome della colonna del database mappata
  • L'annotazione @Basic contrassegna la proprietà come non facoltativa a livello di oggetto Java. E (nullable = false) sulla mappatura della colonna, è responsabile solo della generazione di un vincolo di database NOT NULL.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.