2010-03-26 10 views
8

Ho un problema con la mappatura del datatype a doppia precisione di Oracle Float con il tipo di dati Double di Java. Il validatore dello schema di sospensione sembra non riuscire quando viene utilizzato il tipo di dati Double di Java.Sospensione: Trovato: float, previsto: doppia precisione

org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision 

L'unico modo per evitare questo è quello di disabilitare la convalida dello schema e la speranza lo schema è in sincronia con l'applicazione per funzionare. Deve essere risolto prima che entri in produzione.

evironment di App:
- Grails 1.2.1
- Hibernate-core 3.3.1.GA
- Oracle 10g

+1

Puoi mostrare come effettivamente si mappa questa colonna? A proposito, notando che sei negli ultimi minuti prima di andare in produzione, assicurati solo di fare delle battute sulla tua negligenza per testare la tua app a tempo debito :-) –

+0

Haha :) Non preoccuparti, non sono sciatto quando si tratta di materiale di produzione. Non si spegnerà finché non sarà corretto. Ad ogni modo, è un bug del mio collaboratore incarcerato e sto semplicemente cercando di aiutarlo. Bella osservazione però :) –

+0

Ho modificato la mia domanda in base al tuo suggerimento. Grazie. –

risposta

4

servono ulteriori informazioni. Il tavolo è doppio? Non ho familiarità con Oracle, ma è un tipo a virgola mobile? Che tipo di java.sql.Types si traduce? È possibile vedere il java.sql.Types per il mapping del tipo di database nella classe dialect per il proprio database. In questo caso è org.hibernate.dialect.Oracle10gDialect (che estende 9i e 8i). Sembra che tu abbia

registerColumnType(Types.DOUBLE, "double precision"); 

Così, il tavolo deve essere definito come double precision, e la classe Java deve essere definito come qualcosa che mapperà a Types.Double, di solito double.

dal messaggio di errore, sembra che il vostro tavolo è definito come float che utilizzare questa mappatura

registerColumnType(Types.FLOAT, "float"); 

per i quali il tipo di java previsto sarebbe qualcosa che mappa Types.FLOAT, di solito float; un singolo valore di precisione.

La cosa più semplice da fare è modificare la tabella o la classe java in modo che corrispondano. In alternativa, è possibile specificare un tipo di utente che mapperebbe un singolo valore di precisione su un valore a doppia precisione; Non riesco a pensare al motivo per cui vorresti farlo, ma forse se non avessi il controllo sia della classe che del tavolo, cosa abbastanza rara, penserei.

hth.

1

Abbiamo avuto lo stesso problema. Abbiamo risolto facendo in modo di impostare esplicitamente il tipo di colonna nella mappatura, in questo modo:

<property name="performance" type="double"> 
    <column name="PERFORMANCE" sql-type="float" /> 
</property> 
0

ho avuto un caso in cui il mio Oracle tipo di colonna era NUMBER e il tipo Java era double.

infine risalire che era giù per le impostazioni

<property name="hbm2ddl.auto">validate</property>

appena cambiato per

<property name="hbm2ddl.auto">update</property>

e tutto ha funzionato!

7

A meno che non si definisca un tipo di colonna come double precision nel file DDL, Oracle lo convertirà nel tipo di colonna float. Quindi è necessario registrare il doppio come tipo di colonna float nella classe dialect.

public class Oracle10gDialectExtended extends Oracle10gDialect { 

    public Oracle10gDialectExtended() { 
     super(); 
     registerColumnType(Types.DOUBLE, "float"); 
    } 
} 

Infine registro Oracle10gDialectExtended in configurazione Hibernate/JPA come hibernate.dialect.

0

Ho riscontrato questo problema durante la migrazione di un'applicazione jboss 4/hibernate 3 su as7/hibernate4. Problema risolto dal suggerimento di Rob Keilty di cambiare hbm2ddl.auto da convalidare per aggiornare senza dover cambiare il codice legacy.

3

Se si utilizza il metodo di annotazione, è necessario dichiarare il tipo di colonna come di seguito per il campo.

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)") 
private double performance; 
Problemi correlati