2010-03-26 23 views
8

Oracle Float çift duyarlık veri türünün Java Double veri türü ile eşleştirilmesinde bir sorunum var. Hazırda çalışan şema doğrulayıcı, Java Double veri türü kullanıldığında başarısız gibi görünüyor.Hazırda bekletme: Bulunan: float, beklenen: double precision

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

Bunu önlemek için tek yol şema doğrulama devre dışı bırakmak ve şema uygulamasıyla senkronize çalıştırmak üzere olduğunu umut etmektir. Üretime geçmeden önce düzeltilmelidir.

App evironment:
- Grails 1.2.1
- 3.3.1.GA
hazırda çekirdekli - Oracle 10g

+1

Bu sütunu nasıl eşlediğinizi gösterebilir misiniz? Üretimine gitmeden önce son dakikalarda olduğunuzu belirterek Btw, sadece uygulamanızı zamanında test etmek için sloganınızla ilgili esprili açıklamalar aldığınızdan emin olun :-) –

+0

Haha :) Endişelenmeyin, özensiz değilim üretim şeyleri söz konusu olduğunda. Sabit olmadığı sürece sönmez. Her neyse, iş arkadaşımın şifreli bir hatası ve ben sadece ona yardım etmeye çalışıyorum. Güzel bir not olsa :) –

+0

Sorunuzu önerinize göre düzenledim. Teşekkürler. –

cevap

4

fazla bilgiye ihtiyaç var. Masa çift mi? Oracle'la aşina değilim, ama bu bir kayan noktalı tip mi? Ne java.sql.Types türüne çevirir? Veritabanınızın lehim sınıfındaki veritabanı türü eşlemesine java.sql.Types'u görebilirsiniz. Bu durumda org.hibernate.dialect.Oracle10gDialect (9i ve 8i'yi uzatır). Eğer

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

Yani, masa double precision olarak tanımlanması gerekir var ve java sınıfı genellikle Types.Double, double için eşler şey olarak tanımlanması gerekir gibi görünüyor. hata mesajı itibaren

, bu tablo beklenen java tipi genellikle Types.FLOAT, float eşleştiren bir şey olurdu kendisi için bu eşleştirmeyi

registerColumnType(Types.FLOAT, "float"); 

kullanacağı float olarak tanımlanır benziyor; Tek bir hassas değer.

Yapılması en kolay şey, tablonuzu veya java sınıfınızı eşleşmesidir. Alternatif olarak, tek bir hassas değeri bir çift duyarlık değerine eşleyecek bir kullanıcı tipi belirtebilirsiniz; Bunu neden yapmak istediğini düşünemiyorum, ama belki de hem sınıf hem de masa üzerinde kontrol sahibi olmamış olsaydın, ki bu oldukça nadirdir.

hth.

1

Aynı sorunu yaşıyorduk. Biz explicity böyle, haritalama sütun türünü ayarlamak için emin yaparak bunu çözdü: my Oracle sütun tipi NUMBER oldu ve Java tip double nerede

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

Ben dava vardı.

Son olarak sadece

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

ve her şey amele olarak değiştirdim ayarlara

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

aşağı olduğunu takip!

7

DDL dosyasında double precision olarak bir sütun türü tanımlamadıkça, Oracle float sütun türüne dönüştürecektir. Bu nedenle, lehçe sınıfında çift sütunlu şamandıra olarak kayıt olmanız gerekir.

public class Oracle10gDialectExtended extends Oracle10gDialect { 

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

Son olarak hibernate.dialect olarak hazırda/JPA konfigürasyonunda Oracle10gDialectExtended kaydedin.

0

Bir jboss 4/hibernate 3 uygulamasını as7/hibernate4'e geçirirken bu sorunu yaşadım. Sorun, Rob Keilty'nin hbm2ddl.auto'yu geçerli kodun değiştirilmesine gerek kalmadan güncellemeden güncellemesine dair önerisi tarafından çözüldü.

3

Açıklamalama yöntemini kullanıyorsanız, alan için aşağıdaki gibi sütun türünü bildirmeniz gerekir.

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)") 
private double performance; 
İlgili konular