سؤال

انا إدخال داو طبقة في التطبيق لدينا حاليا العمل على SQL Server لأنني بحاجة إلى منفذ إلى أوراكل.

أود أن استخدام السبات و كتابة مصنع (أو استخدام حقن التبعية) إلى اختيار الصحيح DAOs وفقا نشر التكوين.ما هي أفضل الممارسات في هذه الحالة ؟ يجب أن يكون اثنين من حزم مختلفة hibernate.cfg.xml و *.hbm.xml الملفات واختيار لهم تبعا لذلك في المصنع ؟ هل هناك أي فرصة أن بلدي DAOs سوف تعمل بشكل صحيح مع كل DBMS دون (الكثير) من المتاعب ؟

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

المحلول

وعلى افتراض أن أسماء الجداول والأعمدة هي نفسها بين الاثنين، يجب أن تكون قادرا على استخدام ملفات hbm.xml نفسها. ومع ذلك سوف تحتاج بالتأكيد لتزويد مختلف قيمة التكوين السبات (hibernate.cfg.xml)، وسوف تحتاج إلى تغيير لهجة السبات من سيكلسرفير إلى Oracle.

إذا هناك اختلافات اسم طفيفة بين اثنين، ثم أود أن إنشاء مجموعتين من ملفات الخرائط - واحد لكل خادم قاعدة البيانات - وحزمة هذه تصل إلى الجرار منفصلة (مثل yourproject-sqlserver-mappings.jar وyourproject-oracle-mappings.jar)، ونشر التطبيق مع JAR واحد أو أخرى اعتمادا على البيئة.

نصائح أخرى

وفعلت ذلك لعميل في حين يعود - في نشر اعتمادا على خاصية وضع في ملف production.properties لقد غيرت خارج hibernate.dialect في ملف cfg باستخدام النملة (يمكنك استخدام أي محول XML). ولكن هذا لن ينجح الا إذا كان رمز السبات هو السلس راجع للشغل كلا بالواجبات أي لا المكالمات وظيفة ديسيبل محددة الخ HQL / JPAQL ديه وظيفة وتدعو القياسية التي تساعد أيون هذا الصدد مثل UPPER(s)، LENGTH(s) الخ.

إذا وتطبيقات ديسيبل يجب أن تكون بالضرورة مختلفة ثم عليك أن تفعل شيئا مثل ماmatt المقترحة.

لقد عملت على التطبيق الذي يدعم الكثير من قواعد البيانات (Oracle, ينفورميكس, SQL Server, MySQL).لدينا ملف تكوين واحد ومجموعة واحدة من تعيينات.نحن نستخدم jndi على اتصال قاعدة البيانات حتى لا تضطر إلى التعامل مع مختلف عناوين اتصال في التطبيق.عندما كنا تهيئة SessionFactory لدينا طريقة أن يستنتج نوع قاعدة البيانات من الاتصال الأساسي.على سبيل المثال ، انقر على اتصال عبر JNDI ثم استخدام اتصال.getMetaData().getDatabaseProductName() لمعرفة ما هي قاعدة البيانات.هل يمكن أيضا استخدام وعاء متغير البيئة بشكل صريح تعيين.ثم تعيين لهجة باستخدام التكوين.setProperty(البيئة.لهجة ، deducedDialect) و تهيئة SessionFactory كالمعتاد.

بعض الأشياء التي يجب أن تتعامل مع:

  • المفتاح الأساسي جيل.نحن نستخدم نسخة مخصصة TableGenerator استراتيجية لذلك لدينا مفتاح واحد الجدول مع أعمدة الجدول اسم المفتاح التالي.هذه الطريقة في كل قاعدة بيانات يمكن استخدام نفس الاستراتيجية بدلا من تسلسل في أوراكل ، الأصلي SQL Server وغيرها.
  • وظائف محددة إلى قواعد البيانات.نحن تجنبها عندما يكون ذلك ممكنا.السبات التعامل مع اللهجات الأكثر شيوعا.أحيانا علينا أن نضيف أن عادتنا اللهجة الطبقات .هـ.ز.تاريخ الحساب جدا غير القياسية ، لذلك يجب وظيفة اسم خريطة لكل قاعدة بيانات في طريقة القيام بذلك.
  • مخطط الجيل - نستخدم السبات مخطط الجيل فئة - يعمل مع اللهجات لخلق الصحيح DDL لكل نوع من قاعدة البيانات و قوات قاعدة بيانات تطابق تعيينات.عليك أن تكون على بينة من الكلمات لكل قاعدة بيانات ، مثللا تحاول أن يكون الجدول المستخدم في أوراكل (المستخدمين العمل) ، أو الترجمة جدول في MySQL.

وهناك جدول تعيين الخلافات بين أوراكل وسيكلسرفير هنا: http://psoug.org/ المرجع / sqlserver.html

في رأيي أكبر المخاطر هي: 1) التواريخ. وظائف وآليات مختلفة تماما. سيكون لديك لاستخدام رمز مختلف عن كل DB. 2) توليد مفتاح - أوراكل وسيكلسرفير استخدام آليات مختلفة، وإذا كنت في محاولة لتجنب جيل "الأصلي" تماما من خلال وجود جدول المفاتيح الخاصة بك - حسنا، أنت فقط متسلسلة تماما كل ما تبذلونه من "إدراج". ليست جيدة للأداء. 3) التزامن / قفل يختلف قليلا. أجزاء من التعليمات البرمجية التي سوف أداء حساسة ربما تكون مختلفة عن كل DB. 4) أوراكل هي حالة الأحرف، سيكلسرفير ليست كذلك. عليك أن تكون حذرا مع ذلك.

وهناك غيرها الكثير :) كتابة التعليمات البرمجية SQL التي سوف تعمل على اثنين بالواجبات يمثل تحديا. مما يجعلها سريعة يمكن أن يبدو من المستحيل تقريبا في بعض الأحيان.

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