2010-03-26 10 views
8

Ich habe ein Problem mit der Zuordnung von Oracle Float double precision Datentyp zu Java Double Datentyp. Der Hibernate-Schema-Validator scheint fehlzuschlagen, wenn der Java Double-Datentyp verwendet wird.Hibernate: Gefunden: float, expected: double precision

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

Die einzige Möglichkeit, dies zu vermeiden, besteht darin, die Schemaüberprüfung zu deaktivieren und zu hoffen, dass das Schema mit der App synchron läuft. Es muss repariert werden, bevor es in Produktion geht.

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

+1

Können Sie zeigen, wie Sie diese Spalte tatsächlich abbilden? Übrigens, indem du bemerkst, dass du in den letzten Minuten bist, bevor du in Produktion gehst, musst du nur witzige Bemerkungen über deine Schlampigkeit machen, um deine App rechtzeitig zu testen :-) –

+0

Haha :) Mach dir keine Sorgen, ich bin nicht schlampig wenn es um Produktionsmaterial geht. Es wird nicht ausgehen, solange es nicht behoben ist. Wie auch immer, es ist ein Fehler, den einer meiner Kollegen ausgelöst hat und ich versuche ihm einfach zu helfen. Nette Anmerkung obwohl :) –

+0

Ich redigierte meine Frage entsprechend Ihrem Vorschlag. Danke. –

Antwort

4

Sie benötigen weitere Informationen. Der Tisch ist doppelt? Ich bin mit Oracle nicht vertraut, aber ist das ein Gleitkommatyp? Was übersetzt der Typ java.sql.Types? Sie können die Zuordnung von java.sql.Types zum Datenbanktyp in der Dialektklasse für Ihre Datenbank sehen. In diesem Fall ist es org.hibernate.dialect.Oracle10gDialect (die 9i und 8i erweitert). Sieht aus wie Sie

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

So haben, die Tabelle als double precision definiert werden muss, und die Java-Klasse muss als etwas definiert werden, die auf Types.Double, in der Regel double abbildet.

Von der Fehlermeldung, es sieht aus wie Ihre Tabelle als float definiert ist, die diese Zuordnung

registerColumnType(Types.FLOAT, "float"); 

, für die der erwarteten Java-Typ etwas sein würde, die Types.FLOAT abbildet, in der Regel float verwenden würde; ein einzelner Genauigkeitswert.

Am einfachsten ist es, entweder Ihre Tabelle oder Java-Klasse zu ändern. Alternativ können Sie einen Benutzertyp angeben, der einen Wert mit einfacher Genauigkeit einem Wert mit doppelter Genauigkeit zuordnet. Ich kann mir nicht vorstellen, warum du das wirklich tun würdest, aber vielleicht, wenn du nicht die Kontrolle über die Klasse und den Tisch hättest, was ziemlich selten ist, würde ich denken.

hth.

1

Wir hatten das gleiche Problem. Wir lösten es, indem Sie die Spaltentyp in der Mapping-explicity zu setzen, wie folgt aus:

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

Ich hatte einen Fall, in dem meine Oracle Spaltentyp NUMBER war und die Java-Typ war double.

Schließlich verfolgt, dass es nach unten

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

nur geändert, es zu

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

und alles hat funktioniert, um die Einstellungen war!

7

Wenn Sie in der DDL-Datei keinen Spaltentyp wie double precision definieren, konvertiert Oracle ihn in den Spaltentyp float. Daher müssen Sie Double als Float-Spalte Typ in Dialekt-Klasse registrieren.

public class Oracle10gDialectExtended extends Oracle10gDialect { 

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

Schließlich Oracle10gDialectExtended in den Ruhezustand/JPA Konfiguration wie hibernate.dialect registrieren.

0

Ich hatte dieses Problem beim Migrieren einer jboss 4/hibernate 3 App zu as7/hibernate4. Das Problem wurde von Rob Keiltys Vorschlag gelöst, hbm2ddl.auto von validate auf update umzustellen, ohne den alten Code ändern zu müssen.

3

Wenn Sie die Annotationsmethode verwenden, müssen Sie den Spaltentyp wie folgt für das Feld deklarieren.

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