休止状態:実測値:期待フロート、:倍精度
-
22-09-2019 - |
質問
私は、Javaのダブルデータ型へのOracleフロート倍精度データ型のマッピングに問題があります。休止状態スキーマ・バリは、Javaダブルデータ型が使用されているときに失敗するようです。
org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision
これを回避する唯一の方法は、無効スキーマ検証にあり、スキーマが実行さ約アプリと同期している願っています。それが生産に出かける前に、それは固定されている必要があります。
アプリケーションのevironment:
- Grailsの1.2.1
- Hibernateはコア3.3.1.GA
- Oracleの10グラム
解決
より多くの情報が必要。テーブルには、二重のですか?私は、Oracleに精通していないんだけど、それは浮動小数点型ですか?それは何にjava.sql.Types
タイプを翻訳していますか?あなたは、データベースの方言クラスのデータベースタイプへのマッピングjava.sql.Types
を見ることができます。この場合、(9iおよび8iの延び)org.hibernate.dialect.Oracle10gDialect
あります。あなたのように見えますが、
registerColumnType( Types.DOUBLE, "double precision" );
だから、テーブルがdouble precision
のように定義する必要があり、JavaクラスのニーズがTypes.Double
、通常double
にマップされます何かのように定義される。
float
のように定義されるようには、エラーメッセージからは、
このマッピングを使用しているに見えますregisterColumnType( Types.FLOAT, "float" );
予測されるJavaの種類は通常Types.FLOAT
、float
にマップするものになるだろうれます。単精度値
一番簡単な方法は、どちらかの試合にあなたのテーブルまたはJavaクラスを変更です。別の方法として、あなたは倍精度値を単精度値をマップするユーザタイプを指定することができます。あなたはクラスと非常にまれである、テーブル、両方のコントロールを持っていなかった場合、私は、私が思うだろう、多分、あなたは本当にそれをしたいと思う理由を考えることはできません。
HTHます。
他のヒント
double precision
として列の型を定義する場合を除き、、Oracleはfloat
カラム型に変換します。あなたがそう方言クラスでフロート列型としてdoubleを登録する必要があります。
public class Oracle10gDialectExtended extends Oracle10gDialect {
public Oracle10gDialectExtended() {
super();
registerColumnType(Types.DOUBLE, "float");
}
}
最後Oracle10gDialectExtended
としてのHibernate / JPA構成でhibernate.dialect
を登録します。
、あなたはフィールドに以下のように列の型を宣言する必要があります。
@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
私たちは、同じ問題がありました。私たちはこのように、マッピングで明示的に設定列の型に確認することによってそれを解決します:
<property name="performance" type="double">
<column name="PERFORMANCE" sql-type="float" />
</property>
私はOracleの列型がNUMBER
だったとJavaの型がdouble
たケースがあった。
最後に、それは設定
に押されていたことをトレースします <property name="hbm2ddl.auto">validate</property>
だけ
にそれを変更しました <property name="hbm2ddl.auto">update</property>
、すべてが働いた!
私はこの問題を持っていました。問題は、レガシーコードを変更することなく、更新に検証からhbm2ddl.autoを変更するロブKeiltyの提案によって解決ます。
application.properties
hibernate.dialect=com.test.config.Oracle10gDialectExtended
クラスを作成します
package com.test.config;
import java.sql.Types;
import org.hibernate.dialect.Oracle10gDialect;
public class Oracle10gDialectExtended extends Oracle10gDialect {
public Oracle10gDialectExtended() {
registerColumnType(Types.DOUBLE, "float");
}
}