السبات: وجدت: تعويم ، متوقع: دقة مزدوجة
-
22-09-2019 - |
سؤال
لدي مشكلة في تعيين نوع بيانات 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");
}
}