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.