Skip to content

10. Oracle Express 11g الإصدار 2

سنناقش الآن نقل ما تم تنفيذه مع MySQL 5 إلى Oracle Express 11g الإصدار 2.

10.1. إعداد بيئة التطوير

10.1.1. بيئة Eclipse

سنعمل باستخدام بيئة Eclipse التالية:

  

يمكن العثور على مشاريع Oracle المذكورة أعلاه في المجلد [<examples>/spring-database-config\oracle\eclipse].

ملاحظة: اضغط على [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.

قم بتشغيل Oracle Express وعميله [OraManager] (انظر القسم 23.6). سنقوم بإنشاء:

  • قاعدة البيانات [dbproduits] باستخدام مشروع [generic-create-dbproduits
  • قاعدة البيانات [dbproduitscategories] باستخدام مشروع [generic-create-dbproduitscategories

10.1.2. إنشاء المستخدمين

يتم الآن تنفيذ كل شيء في [OraManager]. يجب أن يكون نظام إدارة قواعد البيانات Oracle قيد التشغيل. نستخدم بيانات اعتماد النظام / النظام لمسؤول النظام (يجب أن يكون هذا قد تم تكوينه مسبقًا). سنقوم بإنشاء مستخدمين:

  • [DBPRODUITS / dbproduits]، الذي سيكون مالك قاعدة البيانات [dbproduits
  • [DBPRODUCTSCATEGORIES / dbproducts-categories]، الذي سيكون مالك قاعدة البيانات [dbproducts-categories
  • في [6-7]، بيانات الاعتماد هي [system / system
  • في [14]: أدخل dbproduits؛
  • في [16]، تم إنشاء المستخدم ولكنه لا يمتلك أذونات كافية لتسجيل الدخول. سنمنحه هذه الأذونات باستخدام نص SQL [17-18]؛
  • في [19]، أدخل اسم المستخدم بأحرف كبيرة؛

نقوم بنفس الشيء لإنشاء المستخدم [DBPRODUITSCATEGORIES / dbproduitscategories]:

  

10.1.3. تثبيت برنامج تشغيل Oracle JDBC في مستودع Maven

برنامج تشغيل Oracle JDBC غير متوفر في مستودعات Maven المركزية. يجب تنزيله من Oracle [http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html]:

بمجرد تنزيله، يجب تثبيته في مستودع Maven المحلي. ويتم ذلك باستخدام البرنامج النصي DOS التالي [install.bat] [2]:

"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=ojdbc6.jar -Dpackaging=jar -DgroupId=com.oracle.jdbc -DartifactId=ojdbc6 -Dversion=1.0

حيث يجب استبدال [%M2_HOME%] بمسار دليل تثبيت Maven (انظر القسم 23.2). بمجرد الانتهاء من ذلك، يمكن استيراد برنامج تشغيل JDBC إلى مشاريع Maven باستخدام التكوين التالي:


        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0</version>
</dependency>

10.1.4. إنشاء قاعدة البيانات [dbproduits]

الآن بعد أن أصبح لدينا مستخدم [DBPRODUITS / dbproduits]، سنقوم بالاتصال بـ Oracle باستخدام بيانات الاعتماد التالية:

  • في [6]، أدخل dbproduits؛
  • في [9]، قاعدة البيانات [DBPRODUITS] التي سنستخدمها؛

في فئة [ConfigJdbc] لمشروع [oracle-config-jdbc]، معلمات الاتصال المستخدمة هي كما يلي:


    public final static String DRIVER_CLASSNAME = "oracle.jdbc.OracleDriver";
    public final static String URL_DBPRODUITS = "jdbc:oracle:thin:@localhost:1521:xe";
    public final static String USER_DBPRODUITS = "DBPRODUITS";
    public final static String PASSWD_DBPRODUITS = "dbproduits";
    public final static String URL_DBPRODUITSCATEGORIES = "jdbc:oracle:thin:@localhost:1521:xe";
    public final static String USER_DBPRODUITSCATEGORIES = "DBPRODUITSCATEGORIES";
public final static String PASSWD_DBPRODUITSCATEGORIES = "dbproduitscategories";

يجب عليك تكييف هذه القيم مع إعدادات Oracle الخاصة بك.

في مشروع [oracle-config-jpa-eclipselink]، يتم تعريف كيان JPA على النحو التالي:

  

package generic.jpa.entities.dbproduits;
 
import generic.jdbc.config.ConfigJdbc;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
 
@Entity(name="Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {
 
    // fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genSeqProduits")
  @SequenceGenerator(name="genSeqProduits",sequenceName="PRODUITS_SEQUENCE", allocationSize=5)
    @Column(name = ConfigJdbc.TAB_PRODUITS_ID)
    private Long id;
    @Column(name = ConfigJdbc.TAB_PRODUITS_NOM, unique = true, length = 30, nullable = false)
    private String nom;
    @Column(name = ConfigJdbc.TAB_PRODUITS_CATEGORIE, nullable = false)
    private int categorie;
    @Column(name = ConfigJdbc.TAB_PRODUITS_PRIX, nullable = false)
    private double prix;
    @Column(name = ConfigJdbc.TAB_PRODUITS_DESCRIPTION, length = 100, nullable = false)
    private String description;
 
...
}
  • السطران 18-19: استراتيجية إنشاء المفتاح الأساسي لجدول [PRODUITS] هي [strategy=GenerationType.SEQUENCE]. بالنسبة لـ MySQL، استخدمنا الاستراتيجية [ ] [@GeneratedValue(strategy = GenerationType.IDENTITY)]. مع Oracle Express 11g، لا يمكن استخدام هذه الاستراتيجية؛
  • السطر 18: نحدد أن المفتاح الأساسي سيتم إنشاؤه باستخدام مولد أرقام، يُشار إليه غالبًا باسم التسلسل؛
  • السطر 19: سيقوم مولد التسلسل (تشير سمة الاسم إلى المولد من السطر 18) بإنشاء تسلسل باسم [PRODUITS_SEQUENCE] في قاعدة البيانات [dbproduits]. ونظرًا لأننا نريد قابلية النقل بين تطبيقات JPA، فمن المهم تسمية التسلسل. وإلا، فبدون السطر 19، ستنشئ تطبيقات JPA الثلاثة تسلسلات بأسماء مختلفة، مما يجعل من المستحيل على JPA2 استخدام قاعدة بيانات أنشأتها JPA1؛

نحن جاهزون لتشغيل التكوين [generic-create-dbproduits-eclipselink]:

يؤدي تشغيل هذا التكوين إلى إنشاء كائنين:

  • جدول [PRODUCTS
  • تسلسل باسم [PRODUITS_SEQUENCE]

فيما يلي لغة تعريف البيانات (DDL) لجدول [PRODUCTS]:

 

لا يتم زيادة المفتاح الأساسي [ID] تلقائيًا كما كان الحال مع MySQL. ومع ذلك، يفترض مشروع [spring-jdbc-03] أن نظام إدارة قواعد البيانات (DBMS) يتولى إنشاء المفاتيح الأساسية لجدول [PRODUCTS]. سنقوم بإنشاء مشغل. المشغل هو إجراء مخزن داخل نظام إدارة قواعد البيانات يتم تنفيذه في ظل ظروف معينة. سنقوم بإنشاء مشغل يقوم، مع كل إدراج جديد، بإنشاء المفتاح الأساسي للمنتج الذي تم إدراجه استنادًا إلى التسلسل [PRODUCTS_SEQUENCE] الذي تم إنشاؤه بواسطة تكوين JPA.

  • في [6]، سيتم تنفيذ المشغل [PRODUCTS_ID_TRIGGER] [4] قبل كل عملية إدراج؛
  • في [7]، إجراء مخزن خاص بنظام إدارة قواعد البيانات Oracle. ويحدد أن حقل [ID] للصف المراد إدراجه يجب تهيئته بالقيمة التالية من المولد المسمى [PRODUITS_SEQUENCE
 

أصبحت قاعدة البيانات [dbproduits] جاهزة الآن. قم بتنفيذ التكوينات التالية:

  • [spring-jdbc-generic-01.IntroJdbc01];
  • [spring-jdbc-generic-01.IntroJdbc02
  • [spring-jdbc-generic-03.JUnitTestDao1
  • [spring-jdbc-generic-03.JUnitTestDao2

يجب أن تنجح جميعها.

10.1.5. إنشاء قاعدة البيانات [dbproduitscategories]

  

سنقوم الآن بتشغيل مشروع [generic-create-dbproduitscategories]، الذي سيقوم بإنشاء قاعدة البيانات [dbproduitscategories]. قبل القيام بذلك، في [OraManager]، نقوم بالاتصال باستخدام بيانات الاعتماد [DBPRODUITSCATEGORIES / dbproduitscategories] حتى نتمكن من مراقبة التغييرات التي تم إجراؤها على قاعدة البيانات [dbproduitscategories]:

  

تستخدم كيانات JPA استراتيجيات إنشاء المفاتيح الأساسية التالية:

[الفئة]


public class Categorie implements AbstractCoreEntity {
 
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genSeqCategories")
  @SequenceGenerator(name="genSeqCategories",sequenceName="CATEGORIES_SEQUENCE", allocationSize=5)
    @Column(name = ConfigJdbc.TAB_JPA_ID)
    protected Long id;

[المنتج]


public class Produit implements AbstractCoreEntity {
    // properties
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genSeqProduits2")
  @SequenceGenerator(name="genSeqProduits2",sequenceName="PRODUITS_SEQUENCE", allocationSize=5)
    @Column(name = ConfigJdbc.TAB_JPA_ID)
    protected Long id;

[Role]


public class Role implements AbstractCoreEntity {
    // properties
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genSeqRoles")
  @SequenceGenerator(name="genSeqRoles",sequenceName="ROLES_SEQUENCE", allocationSize=5)
    @Column(name = ConfigJdbc.TAB_JPA_ID)
    protected Long id;

[User]


public class User implements AbstractCoreEntity {
    // properties
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genSeqUsers")
  @SequenceGenerator(name="genSeqUsers",sequenceName="USERS_SEQUENCE", allocationSize=5)
    @Column(name = ConfigJdbc.TAB_JPA_ID)
    protected Long id;

[UserRole]


public class UserRole implements AbstractCoreEntity {
    // properties
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genSeqUsersRoles")
  @SequenceGenerator(name="genSeqUsersRoles",sequenceName="USERS_ROLES_SEQUENCE", allocationSize=5)
    @Column(name = ConfigJdbc.TAB_JPA_ID)
    protected Long id;

كما تم في قاعدة البيانات [dbproduits]، سيتم إنشاء خمسة تسلسلات. يتم استخدامها من قبل تطبيقات JPA لإنشاء مفاتيح أساسية. لا تستخدم تطبيقات JPA المشغلات كما فعلنا سابقًا، بل تستعلم عن التسلسلات للحصول على المفتاح الأساسي التالي. سنقوم أيضًا بإنشاء المفاتيح الأساسية باستخدام المشغلات. هذه مطلوبة لمشروع [spring-jdbc-04].

نقوم بتشغيل التكوين [generic-create-dbproduitscategories-eclipselink]:

ونحصل على النتيجة التالية:

  

ثم نقوم بإنشاء خمسة مشغلات لإنشاء المفاتيح الأساسية للجداول الخمسة:

 

يتم ربط المشغلات بالجداول على النحو التالي:

الجدول
المشغل
التسلسل
الفئات
مُشغِّل_معرّفات_الفئات
تسلسل_الفئات
المنتجات
مُحفز_معرف_المنتجات
تسلسل_المنتجات
الأدوار
مُحفِّز_معرّف_الأدوار
تسلسل_الأدوار
المستخدمون
مشغلات_معرف_المستخدمين
تسلسل_المستخدمين
USERS_ROLES
مشغلات_معرفات_أدوار_المستخدمين
تسلسل_أدوار_المستخدمين
  

يتطلب مشروع [spring-jdbc-04] أن يكون للعمود [VERSIONING] قيمة افتراضية في كل جدول من الجداول:

ونقوم بذلك لجميع الجداول الخمسة.

الآن، قم بتشغيل التكوينات:

  • [spring-jdbc-generic-04.JUnitTestDao];
  • [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink];

يجب أن ينجح كلاهما.

10.2. تكوين طبقة JDBC

 

يقوم مشروع [oracle-config-jdbc] بتكوين طبقة [JDBC] في بنية الاختبار التالية:

هذا المشروع مشابه لمشروع التكوين [mysql-config-jdbc] الخاص بطبقة JDBC لنظام إدارة قواعد البيانات MySQL (انظر القسم 3.3). نعرض التغييرات فقط:

يستورد ملف [pom.xml] برنامج تشغيل Oracle JDBC:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>dvp.spring.database</groupId>
    <artifactId>generic-config-jdbc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>configuration generic jdbc</name>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.3.RELEASE</version>
    </parent>
 
    <dependencies>
        <!-- dépendances variables ********************************************** -->
        <!-- driver JDBC from SGBD -->
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- dépendances constantes ********************************************** -->
        ....
    </dependencies>
...
</project>
  • الأسطر 18-22: يستبدل برنامج تشغيل Oracle JDBC برنامج تشغيل MySQL؛

التغيير الثاني في فئة [ConfigJdbc]، التي تحدد بيانات اعتماد قاعدة البيانات:


    // paramètres de connexion
    public final static String DRIVER_CLASSNAME = "oracle.jdbc.OracleDriver";
    public final static String URL_DBPRODUITS = "jdbc:oracle:thin:@localhost:1521:xe";
    public final static String USER_DBPRODUITS = "DBPRODUITS";
    public final static String PASSWD_DBPRODUITS = "dbproduits";
    public final static String URL_DBPRODUITSCATEGORIES = "jdbc:oracle:thin:@localhost:1521:xe";
    public final static String USER_DBPRODUITSCATEGORIES = "DBPRODUITSCATEGORIES";
public final static String PASSWD_DBPRODUITSCATEGORIES = "dbproduitscategories";

التغيير الثالث يتعلق بالعدد الأقصى للمعلمات التي يمكن أن يدعمها :


    // max number of parameters of a [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 1000;

يُنشئ اختبار [JUnitTestPushTheLimits] عبارات SQL لـ 5,000 منتج، مما سيؤدي إلى إنشاء كائنات [PreparedStatement] تحتوي على 5,000 معلمة. دعم MySQL هذه القيمة، لكن Oracle لم يدعمها. قمنا بتخفيض هذه القيمة إلى 1,000، وأصبح الأمر يعمل.

 

ملاحظة: اضغط على [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.

يقوم مشروع [oracle-config-jpa-eclipseLink] بتكوين طبقة [JPA] في بنية الاختبار:

يشبه هذا المشروع مشروع التهيئة [mysql-config-jpa-eclipselink] (انظر القسم 7.3) الخاص بطبقة EclipseLink JPA لنظام إدارة قواعد البيانات MySQL. ونعرض هنا التغييرات فقط:

التغيير الأول موجود في فئة [ConfigJpa] في تعريف حبة [jpaVendorAdapter]:


    // the provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        // Note: JPA entities and Eclipselink configuration are in the META-INF/persistence.xml file
        EclipseLinkJpaVendorAdapter eclipseLinkJpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
        eclipseLinkJpaVendorAdapter.setShowSql(false);
        eclipseLinkJpaVendorAdapter.setDatabase(Database.ORACLE);
        eclipseLinkJpaVendorAdapter.setGenerateDdl(true);
        return eclipseLinkJpaVendorAdapter;
}
  • السطر 7: نخبر تطبيق JPA أنه سيعمل مع قاعدة بيانات Oracle. سيقوم تطبيق JPA بعد ذلك بتبني أنواع البيانات الخاصة بـ Oracle ولغة SQL.

التغيير الثاني يتعلق باستراتيجية إنشاء المفتاح الأساسي. تم عرض الاستراتيجية الجديدة في القسم 10.1.

10.4. تكوين طبقة Hibernate JPA

 

ملاحظة: اضغط على [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.

مشروع [oracle-config-jpa-hibernate] مشابه لمشروع [mysql-config-jpa-hibernate] (القسم 6.3) مع نفس التعديلات التي استرشد بها نقل [mysql-config-jpa-eclipselink] إلى مشروع [oracle-config-jpa-eclipselink] (القسم 10.3).

مع تطبيق هذه التعديلات، من المفترض أن ينجح تنفيذ تكوين [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink].

10.5. تكوين طبقة OpenJpa JPA

 

ملاحظة: اضغط على [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.

مشروع [oracle-config-jpa-openjpa] مشابه لمشروع [mysql-config-jpa-openjpa] (القسم 8.3) مع نفس التعديلات التي تم استخدامها لنقل مشروع [mysql-config-jpa-eclipselink] إلى مشروع [oracle-config-jpa-eclipselink] (القسم 10.3).

مع تطبيق هذه التعديلات، من المفترض أن ينجح تنفيذ تكوين [spring-jpa-generic-JUnitTestDao-openjpa].