11

Oracle Float double precision データ型から 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-core 3.3.1.GA
- Oracle 10g

4

8 に答える 8

13

double precisionDDLファイルのように列タイプを定義しない限り、Oracleはそれをfloat列タイプに変換します。したがって、方言クラスでfloat列型としてdoubleを登録する必要があります。

public class Oracle10gDialectExtended extends Oracle10gDialect {

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

最後にOracle10gDialectExtended、Hibernate/JPA構成にとして登録しますhibernate.dialect

于 2012-11-07T14:48:38.603 に答える
5

Annotation メソッドを使用している場合は、フィールドに対して次のように列タイプを宣言する必要があります。

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
于 2015-07-14T13:43:47.767 に答える
4

詳細情報が必要です。テーブルはダブル?Oracleに詳しくないのですが、浮動小数点型ですか?java.sql.Types訳すと何型?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 クラスを一致するように変更することです。または、単精度値を倍精度値にマップするユーザー タイプを指定できます。なぜあなたが本当にそれをしたいのかはわかりませんが、クラスとテーブルの両方を制御できなかったとしたら、それは非常にまれなことだと思います。

h番目。

于 2010-03-26T16:51:20.620 に答える
2

同じ問題がありました。次のように、マッピングで列タイプを明示的に設定することで解決しました。

<property name="performance" type="double">
  <column name="PERFORMANCE" sql-type="float" />
</property>
于 2010-08-18T12:39:25.540 に答える
0

Oracle の列の型がNUMBERで、Java の型がであるケースがありましたdouble

最後に、それが設定にかかっていることをたどりました

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

に変更しただけです

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

そしてすべてがうまくいきました!

于 2012-06-26T17:30:58.337 に答える