سؤال

لدي مشكلة في تعيين نوع بيانات Oracle Float Double Precision إلى نوع بيانات Java المزدوج. يبدو أن التحقق من مخطط السبات يفشل عند استخدام نوع البيانات المزدوجة Java.

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

الطريقة الوحيدة لتجنب ذلك هي تعطيل التحقق من صحة المخطط وآمل أن يكون المخطط متزامنًا مع التطبيق على وشك التشغيل. يجب إصلاحه قبل أن يخرج إلى الإنتاج.

evironment للتطبيق:
- Grails 1.2.1
- Hibernate-Core 3.3.1.ga
- أوراكل 10g

هل كانت مفيدة؟

المحلول

بحاجة إلى مزيد من المعلومات. الجدول مزدوج؟ لست على دراية بأوراكل ، لكن هل هذا نوع نقطة عائمة؟ ماذا 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 لمطابقة. بالتناوب ، يمكنك تحديد نوع المستخدم الذي من شأنه أن يرسم قيمة دقيقة واحدة لقيمة دقة مزدوجة ؛ لا أستطيع التفكير في سبب رغبتك حقًا في القيام بذلك ، ولكن ربما إذا لم يكن لديك سيطرة على كل من الفصل والجدول ، وهذا أمر نادر جدًا ، على ما أظن.

HTH.

نصائح أخرى

ما لم تحدد نوع العمود باسم double precision في ملف DDL ، سوف يقوم Oracle بتحويله إلى float نوع العمود. لذلك تحتاج إلى تسجيل مزدوج كنوع عمود تعويم في فئة لهجة.

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>

كان لدي حالة كان نوع عمود أوراكل الخاص بي NUMBER وكان نوع جافا double.

تم تتبعه أخيرًا إلى الإعدادات

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

فقط غيرته إلى

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

وكل شيء نجح!

واجهت هذه المشكلة عند ترحيل تطبيق JBoss 4/Hibernate 3 إلى AS7/Hibernate4. تم حل المشكلة من خلال اقتراح Rob Keilty لتغيير HBM2DDL.AUTO من التحقق من الصحة للتحديث دون الحاجة إلى تغيير التعليمات البرمجية القديمة.

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");
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top