2012-06-08 15 views
8

Sto utilizzando l'API javax.persistence e Hibernate per creare annotazioni e entità permanenti e i relativi attributi in un database Oracle 11g Express.Grande precisione digitale non persistente con annotazioni JPA

Ho il seguente attributo in un'entità:

@Column(precision = 12, scale = 9) 
private BigDecimal weightedScore; 

L'obiettivo è di persistere un valore decimale con un massimo di 12 cifre e un massimo di 9 di tali cifre a destra del decimale.

Dopo aver calcolato weightedScore, il risultato è 0.1234, ma dopo aver eseguito il commit dell'entità con il database Oracle, il valore viene visualizzato come 0.12.

Posso vedere questo utilizzando un oggetto EntityManager per interrogare la voce o visualizzarla direttamente nell'interfaccia Oracle Application Express (Apex) in un browser web.

Come devo annotare il mio attributo BigDecimal in modo che la precisione sia mantenuta correttamente?

Nota: Usiamo un database HSQL in memoria per eseguire i nostri test unitari e non presenta il problema con la mancanza di precisione, con o senza l'annotazione @Column.

Aggiornamento:

Guardando la descrizione della tabella, la definizione della colonna weightedScore è NUMBER(19, 2). Ho anche provato a modificare l'annotazione su @Column(columnDefinition="Number(12, 9)"), ma questo non ha avuto alcun effetto. Qualcuno sa perché Oracle non risponde a queste annotazioni?

risposta

5

ho trovato la risposta. Huzzah!

ho tentato di eseguire la seguente query tramite l'interfaccia Oracle Apex:

alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));

ho ricevuto un errore che indica che una colonna contenente dati non possono essere modificati per avere meno precisione o meno scala. Questo era il mio problema!

Poiché stavo tentando di modificare la tabella con i dati esistenti, avevo bisogno di rilasciare la tabella e inizializzarla di nuovo, o di alterare la colonna per avere solo maggiore precisione e scala.

ho tentato la seguente query con successo:

alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));

Il ragionamento è che voglio aggiungere 7 posti di precisione alla destra del decimale, quindi sto aggiungendo 7 per la precisione globale compensare l'aumento di scala. In questo modo, la colonna può mantenere tutta la precisione esistente a sinistra dei decimali aggiungendo al contempo precisione sul lato destro.