كيفية تعيين Oracle Timestamp إلى نوع Java المناسب في السبات؟
-
21-09-2019 - |
سؤال
أنا جديد على السبات وأنا متعثر. في قاعدة البيانات الخاصة بي ، لديّ جداول تحتوي على أعمدة 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;
}
}