2010-03-26 35 views
8

我有一個Oracle浮點雙精度數據類型映射到Java Double數據類型的問題。當使用Java Double數據類型時,hibernate模式驗證器似乎失敗。休眠:發現:浮動,預期:雙精度

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

避免這個問題的唯一方法是禁用方案驗證和希望的模式是與應用同步快要用完。它在投入生產之前必須修復。

應用程序的環境現狀:
- Grails的1.2.1
- Hibernate的核心3.3.1.GA
- Oracle 10g中

+1

你能說明你是如何真正映射這一列的嗎?順便提一下,你要在製作前的最後幾分鐘,你只要確保得到有關你sloppiness的機智的言論,以適時測試你的應用程序:-) – 2010-03-26 16:49:36

+0

哈哈:)別擔心,我不是馬虎當涉及到生產的東西。只要不固定,它就不會熄滅。無論如何,這是我的一位同事遇到的問題,我只是想幫助他。好評如下:) – 2010-03-27 23:37:16

+0

我根據你的建議編輯了我的問題。謝謝。 – 2010-03-27 23:38:27

回答

4

需要更多信息。桌子是Double?我不熟悉Oracle,但它是浮點類型嗎?什麼java.sql.Types類型它轉化爲?您可以在數據庫的dialect類中看到java.sql.Types數據庫類型映射。在這種情況下,它是org.hibernate.dialect.Oracle10gDialect(它擴展了9i和8i)。看起來你有

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

因此,表需要被定義爲double precision,和Java類需要被定義爲一些將映射到Types.Double,通常double

從錯誤信息,它看起來像你的表被定義爲float這將使用此映射

registerColumnType(Types.FLOAT, "float"); 

其預期Java類型會是這樣一個映射到Types.FLOAT,通常float;一個精度值。

要做的最簡單的事情是改變你的表或Java類來匹配。或者,您可以指定將單個精度值映射到雙精度值的用戶類型;我想不出爲什麼你真的想這麼做,但是如果你不能控制班級和表格,這很少見,我想。

hth。

1

我們遇到了同樣的問題。我們解決了它,只要確保明確地設置列類型的映射,像這樣:

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

我有一個情況我的Oracle列類型爲NUMBER和Java類型爲double

最後追查,這是下降到設置

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

只是把它改爲

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

和一切工作!

7

除非您在DDL文件中將列類型定義爲double precision,否則Oracle會將其轉換爲float列類型。所以你需要在方言類中註冊double作爲float列類型。

public class Oracle10gDialectExtended extends Oracle10gDialect { 

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

在休眠/ JPA配置最後寄存器Oracle10gDialectExtended作爲hibernate.dialect

0

我在將jboss 4/hibernate 3應用程序遷移到as7/hibernate4時遇到此問題。 Rob Keilty建議將hbm2ddl.auto從驗證更改爲更新,而無需更改舊版代碼,從而解決了問題。

3

如果您使用Annotation方法,則需要爲該字段聲明如下的列類型。

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