كيفية تعيين Oracle Timestamp إلى نوع Java المناسب في السبات؟

StackOverflow https://stackoverflow.com/questions/2473866

سؤال

أنا جديد على السبات وأنا متعثر. في قاعدة البيانات الخاصة بي ، لديّ جداول تحتوي على أعمدة TIMESTAMP(6). أنا أستخدم NetBeans 6.5.1 وعندما أقوم بإنشاء hibernate.reveng.xml, hbm.xml files, ، و pojo files يقوم بتعيين الأعمدة لتكون من النوع Serializable. هذا ليس ما كنت أتوقعه ، ولا ما أريدهم أن يكونوا.

وجدت هذه انشر على منتديات السبات التي تقول:

<sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />

في ال hibernate.reveng.xml ملف.

في NetBeans ، لا يمكنك إنشاء التعيينات من هذا الملف (إنه ينشئ ملفًا جديدًا في كل مرة) ولا يبدو أن لديه القدرة على إعادة تجميعها من الملف أيضًا (على الأقل وفقًا لـ هذه من المقرر أن يكون متاحًا في الإصدار 7).

لذلك أحاول معرفة ما يجب القيام به. أنا أكثر ميلًا للاعتقاد بأنني أفعل شيئًا خاطئًا لأنني جديد على هذا ، ويبدو أنه سيكون مشكلة شائعة للآخرين.

  • إذا ما الخطأ الذي أفعله؟
  • إذا لم أفعل أي شيء خاطئ ، كيف يمكنني العمل حول هذا؟

أنا أستخدم NetBeans 6.5 ، Oracle 10G ، وأعتقد أن Hibernate 3 (جاء مع NetBeans).

تعديل: من المفترض أن أقول أنني وجدت هذه سؤال stackoverflow ، لكنها حقا مشكلة مختلفة.

تحديث:برنامج تشغيل Oracle JDBC الذي كنت أستخدمه (OJDBC14.JAR) هو 9.0.2.0.0 لقد حاولت الآن أيضًا:

  • OJDBC14.JAR الإصدار 10.2.0.4.0
  • OJDBC6.JAR الإصدار 11.2.0.1.0
هل كانت مفيدة؟

المحلول

لقد وجدت عملًا لهذه المشكلة. يبدو أن المشكلة نفسها تدور حول حقيقة أن NetBeans 6.5 (وأنا في وقت لاحق حتى هذه النقطة) لا تسمح لك بعكس هندسة قاعدة بيانات من موجودة hibernate.reveng.xml ملف. من المقرر أن يكون هذا متاحًا في الإصدار 7.

العمل حوله وجدته هو إنشاء مهمة ANT لإعادة إنشاء hbm.xml و Pojo Java ملفات. لدي حاليًا هذا مدمن مخدرات عندما أقوم بعمل نظيف وبناء ، لكنني سأحاول إيجاد طريقة لإفصاحها تمامًا ، لأنه لن يتم تشغيله إلا عندما يتغير مخطط قاعدة البيانات.

لإنجاز هذا عندما تقوم بعمل نظيف وبناء رغم أنك بحاجة إلى تحرير build.xml ملف.

الجزء الأول هو المكتبات التي ستحتاجها. لذا أضف:

<path id="toolslib">
        <path location="lib/hibernate-support/hibernate-tools.jar" />
        <path location="lib/hibernate-support/hibernate3.jar" />
        <path location="lib/hibernate-support/freemarker.jar" />
        <path location="lib/hibernate-support/jtidy-r938.jar" />
        <path location="lib/ojdbc14.jar" />
</path>

يجب أن يكون لديك بالفعل ملفات hibernate. jar و hibernate3.jar و ojdbc14.jar على جهازك. لذلك فقط قم بتغيير المسار إليهم. ال Freemaker.Jar و Jtidy-R938.Jar سوف تحتاج إلى تنزيل ، حيث لم يكن لدي هؤلاء.

تحت هذا في build.xml ستحتاج إلى إضافة:

<taskdef name="hibernatetool"
     classname="org.hibernate.tool.ant.HibernateToolTask"
     classpathref="toolslib">
    <classpath>
        <fileset dir="lib">
            <include name="**/*.jar"/>
        </fileset>
    </classpath>
</taskdef>

القسم الأخير الذي ستحتاجه هو المجموعة التي سيتم تشغيلها في قسم ما بعد التنظيف:

<target name="-post-clean">
        <delete dir="src/*Put the foler where your pojos and hbm.xml files are located*"/>
        <hibernatetool>
            <jdbcconfiguration
                configurationfile="src\hibernate.cfg.xml"
                packagename="*the package where you want them recreated*"
                revengfile="src\hibernate.reveng.xml"
                detectmanytomany="true"
            />
            <hbm2hbmxml destdir="src" />
            <hbm2java  destdir="src" />
        </hibernatetool>
</target>
  • سيحذف جزء الحذف ملفات HBM و POJO الحالية ، قبل إعادة إنشاءها.
  • ال configurationfile يشير إلى ملف التكوين الرئيسي الخاص بك.
  • اسم الحزمة هو الحزمة المنفصلة DOT التي تريد إنشائها في (com.stackoverflow.pojo علي سبيل المثال).
  • ال revengfile هو ملف XML الهندسي العكسي لاستخدامه عند إنشاء ملفات HBM و POJO.
  • ال hbm2hbmxml سوف يخلق hbm.xml ملفات الجداول الخاصة بك.
  • ال hbm2java سيتم إنشاء ملفات Java Pojo لجداولك.

الآن للحصول على طوابع الزمنية Oracle لتكون شيئًا غير Serializable, ، تحرير hibernate.reveng.xml ملف وإضافة:

<type-mapping>
        <sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />
</type-mapping>

فقط بعد علامة الاختيار المخطط.

لذلك لن يكون النظيف والبناء والطابع الزمني java.sql.Timestamp بدلاً من Serializable أشياء.

هذه إجابة طويلة أعرفها ، لكن هذا يجب أن يعمل أيضًا من أجل أي تغييرات أخرى يجب عليك تعيينها في hibernate.reveng.xml ملف (على ما أظن). أنا لست خبيرًا في السبات ، لذلك قد يختلف عدد الأميال مع هذا.

تحديث:لذلك بعد بعض googling وجدت هذه موقع حول مهام النمل المخصصة في NetBeans. لذلك قمت ببساطة بتغيير اسم الهدف ليكون gen-dao والآن لا يتم تشغيله في كل مرة أقوم فيها بنظيفة وبناء ، فقط عندما أدعوها على وجه التحديد.

نصائح أخرى

واجهت قضية مماثلة وحلها عن طريق كتابة revengningstrategy الخاصة بي.

لدي جدول له عمودين مثل Timestamp_with_timezone و timestamp_with_local_timezone وفي عملية الهندسة العكسية ، يقومون بتخطيط مصلي.

sqltypes من timestamp_with_timezone و timestamp_with_local_timezone أنواع -101 و -102 Java.Sql.Types لهذه الأنواع ، وبالتالي فهي رسم الخرائط إلى المصل.

هكذا كتبت revengningstrategy الخاصة بي ، والتي تحول هذا النوع إلى timestamp. الذي يتحول المتدرب إلى timestamptype hibernate.

public class OracleRevengNamingStrategy extends DefaultRevengNamingStrategy {

    private static final Integer TIMESTAMP_WITH_TIMEZONE_SQL_CODE = -101;

    private static final Integer TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE = -102;


    public OracleRevengNamingStrategy(ReverseEngineeringStrategy delegate) {
        super(delegate);
    }

    // Converts Timestamp with tomezone and Time stamp with local time zone to Timestamp
    @Override
    public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale,
                                            boolean nullable, boolean generatedIdentifier) {
        String type;

        if (sqlType == TIMESTAMP_WITH_TIMEZONE_SQL_CODE || sqlType == TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE) {
            type = "timestamp";
        } else {
            type = super.columnToHibernateTypeName(table, columnName, sqlType, length, precision, scale, nullable, generatedIdentifier);
        }

        return type;
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top