2012-10-22 15 views
13

Ho una classe negozio con la seguente variabileImpossibile impostare booleano su null

@Column(columnDefinition = "bit") 
private boolean atShop; 

da questo valore, sto usando HSQL per recuperare queste informazioni dall'applicazione

from Person person 
left join fetch person.shop 

quando provo chiamata questa affermazione HSQL ottengo il seguente errore

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop 

Si sta lanciando questo perché sta cercando di impostare il booleano a null in HSQL. Posso risolvere questo problema modificando private boolean atShop;-private Boolean atShop; ma voglio mantenere questo come un boolean come sto salvandolo come un po 'nel mio database

C'è un modo per risolvere questo senza cambiare boolean a Boolean?

EDIT:

So che booleano può essere solo vero/falso e booleana può essere impostato per nulla, ma c'è un modo per ottenere hibernate/primavera per impostare questo valore su false (che ho pensato dovrebbe farlo automaticamente) invece di provare a impostarlo su null e a lanciare questa eccezione?

ho anche provato ad aggiungere annotazioni per impostare automaticamente il valore su falso, ma questo non funziona neanche

@Column(nullable = false, columnDefinition = "bit default 0") 
private boolean atShop; 
+1

sì, conosco le differenze tra booleano e booleano, la mia applicazione lancia questa eccezione perché spring/hibernate sta tentando di impostare atShop su null invece che su false, ma come posso ottenerlo su false e non null? –

+3

Accidenti, lo odio quando le persone rispondono alle domande senza alcuna spiegazione e solo perché non sono esattamente quello che stanno cercando. Soprattutto in una domanda come questa che in origine non era abbastanza chiara. Mi fa perdere la volontà di cercare di aiutare. –

+0

@Edwin Dalorzo: Ma non sono stato io a votare per le risposte, ecco perché ho aggiunto la sezione di modifica alla mia domanda perché è stata colpa mia se non ho spiegato che ho già capito le differenze tra booleano e booleano –

risposta

28

-boolean è un primitivo tipo, e può avere un valore di soli true or false.

- considerando Boolean è un oggetto involucro e può essere assegnato un valore nullo .

- Da Java 1.5AutoBoxing è previsto, in modo da poter convertire booleano per booleana e di nuovo a booleana con semplice operatore di assegnazione (=), in modo da poter fare questo in luoghi in cui si desidera booleano invece di booleana.

1

boolean è primitivo potrebbe essere true o false e il valore predefinito è false. Per ottenere null, il suo tipo di oggetto è Boolean.

10

Invece di armeggiare con il codice di ibernazione, modificare la definizione della tabella in valori null predefiniti su falso (o 0). In questo modo quando si arriva a leggere dal database sarà sempre hanno valori validi (che, dal momento che è booleano, ha più senso)

+0

ho provato ad aggiornare la colonna nella tabella per avere un valore predefinito di 0 ('ALTER TABLE Shop ALTER COLUMN bit atShop NOT NULL DEFAULT (0)') ma ho ancora lo stesso errore –

+0

Probabilmente hai bisogno di correggere tutti i valori che hai attualmente salvato, saranno nulli. È necessario impostare la colonna su NOT NULL. – DaveRlz

+0

ho finito per eliminare completamente la colonna dalla tabella e aggiungerla nuovamente usando 'ALTER TABLE Shop ADD atShopbit NOT NULL DEFAULT (0)' e anche se tutti i valori sono impostati su 0 e tutto sembra ok l'errore sta ancora comparendo –

3

null non è lo stesso di false (né è la stessa di true). null ha un significato molto specifico. Ecco perché Hibernate fa quello che fa ... perché è davvero l'unica cosa che ha senso, nonostante quello che pensi che dovrebbe fare.

Se si desidera impostare Hibernate per il trattamento di null in quelle colonne come false, l'unica soluzione reale consiste nello sviluppare un mapping di tipo Hibernate personalizzato per questo trattamento speciale di "null non è realmente un null". È possibile farlo implementando l'interfaccia org.hibernate.type.Type o l'interfaccia org.hibernate.usertype.UserType. La soluzione migliore è estendere la mappatura di tipo booleano standard e tessere nella speciale gestione nulla.

Una cosa a cui fare attenzione, tuttavia, è l'esecuzione di query poiché il controllo dell'eguaglianza contro null non è mai valido in SQL ANSI. Risolve ciò che SQL chiama UNDEFINED, che di solito significa FALSE.

0

Sapete che potreste semplicemente provare a catturare il problema se genera un'eccezione che significa che è nullo, quindi impostarlo su falso.

+0

Funziona se hai il controllo del codice in cui viene eseguito l'assegnamento ma in questo caso l'OP riceve i valori da Hibernate, che esegue tutti i compiti e le mappature per te, quindi senza implementare il proprio gestore di tipo per Hibernate, come menzionato nella risposta di Steve Ebersole sopra, questa non è davvero un'opzione – StormeHawke

Problemi correlati