2013-02-15 8 views
8

Data questa classe mappata con JPA (utilizzando JPA 1.0 e Sospensione):Tipo primitivo nella mappatura JPA. Cosa succede se la colonna del database potrebbe essere NULL?

@Entity 
public class Foo { 

    private int bar; 

    /* ... */ 
} 
  1. Cosa accade se provo a caricare un record che ha la colonna BAR impostato su NULL?
  2. posso specificare come impostare il campo bar quando la colonna corrispondente è NULL?

Note

So che questa non è una pratica migliore. La questione è più per curiosità ed è ispirato da questa situazione:

  • La tabella del database è una tabella di gestione temporanea: l'aggiunta di un vincolo NOT NULL è impraticabile. I dati errati sono previsti e il punto del mio codice è quello di convalidare, ripulire e/o rifiutare i dati prima di caricarli nel database "reale".
  • mi hanno valori predefiniti accettabili per alcuni campi. Ad esempio, una bandiera boolean che dovrebbe default false.
+3

Se la colonna db può contenere nulla si dovrebbe utilizzare una classe wrapper per rappresentare il valore. – Perception

risposta

2
  1. Eccezione

2.

@Column(name = “bar”, nullable = false, columnDefinition = “bigint(20) default 0″) 
private int bar; 

si risolve il problema.

+0

Ma con il punto 2 ho bisogno di cambiare la definizione della colonna del database, no? –

+0

Sono d'accordo sul fatto che se vuoi davvero una rappresentazione Null devi solo cambiare barra in Integer. Ma se vuoi evitare null, puoi impostare un valore predefinito. – Matheus

+0

A proposito, penso che i tipi primitivi abbiano già un valore predefinito. Ma se hai già una colonna con voci nulle, la barra di modifica su Integer è la soluzione. – Matheus

11

avrei preferito usare gli oggetti se una colonna può contenere valore nullo, perché l'idea di Matheus introduce dati falsi. NULL <> 0!

+0

puoi spiegare cosa intendi con dati falsi qui. Matheus sta impostando il valore predefinito su 0 e nullable = falso, quindi non sarà mai nullo. cosa intendi con dati errati/falsi? – Ankit

+2

'columnDefinition' viene utilizzato solo * (dichiarazioni cioè generando per creare e modificare tabelle) * per la generazione DDL, così il valore di default sarà il valore di default del primitivo. In realtà, non si dovrebbero creare colonne con valori predefiniti quando si utilizza JPA. Se il tuo campo è primitivo, per impostazione predefinita verrà utilizzato il valore predefinito del tipo primitivo. Se il campo è un oggetto, il database imposterà il valore predefinito come definito nella tabella, ma la controparte della colonna nell'oggetto entità inserito non verrà aggiornata per riflettere il valore predefinito. –

Problemi correlati