Skip to content

10. اوراکل اکسپرس ۱۱g نسخه ۲

اکنون به بررسی انتقال کاری که با MySQL5 انجام شده به Oracle Express 11g Release 2 می‌پردازیم.

10.1. راه‌اندازی محیط کاری

10.1.1. محیط اکلیپس

ما با محیط اکلیپس زیر کار خواهیم کرد:

  

پروژه‌های Oracle که در بالا فهرست شده‌اند را می‌توان در پوشه [<exemples>/spring-database-config\oracle\eclipse] یافت.

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، [Alt-F5] را اجرا کنید.

Oracle Express و کلاینت آن [OraManager] را راه‌اندازی کنید (به بخش 23.6 مراجعه کنید). ما تولید خواهیم کرد:

  • پایگاه داده [dbproduits] را با استفاده از پروژه [generic-create-dbproduits] ایجاد می‌کنیم؛
  • پایگاه داده [dbproduitscategories] با پروژه [generic-create-dbproduitscategories

10.1.2. ایجاد کاربران

اکنون همه چیز در [OraManager] انجام می‌شود. فرآیند Oracle SGBD باید در حال اجرا باشد. ما از اعتبارنامه‌های «system / system» برای مدیر سیستم استفاده می‌کنیم (این باید از قبل پیکربندی شده باشد). ما دو کاربر ایجاد خواهیم کرد:

  • [DBPRODUITS / dbproduits]، که مالک پایگاه داده [dbproduits] خواهد بود؛
  • [DBPRODUITSCATEGORIES / dbproduitscategories]، که مالک پایگاه داده [dbproduits] خواهد بود؛
  • در [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 نصب شود. این کار با استفاده از اسکریپت زیر انجام می‌شود:

"%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] را داریم، با استفاده از این اعتبارات به اوریکل وارد می‌شویم:

  • در [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;

...
}
  • خطوط ۱۸–۱۹: استراتژی تولید کلید اصلی برای جدول [PRODUITS]، [strategy=GenerationType.SEQUENCE] است. برای MySQL، از استراتژی [@GeneratedValue(strategy = GenerationType.IDENTITY)] استفاده شده بود. با Oracle Express 11g، این استراتژی قابل استفاده نیست؛
  • خط ۱۸: مشخص شده است که کلید اصلی با استفاده از یک شمارنده (generator) تولید خواهد شد، که اغلب به آن توالی (sequence) گفته می‌شود؛
  • خط ۱۹: تولیدکننده توالی (ویژگی name به تولیدکننده در خط ۱۸ اشاره دارد) یک توالی به نام [PRODUITS_SEQUENCE] را در پایگاه داده [dbproduits] ایجاد خواهد کرد. از آنجا که ما می‌خواهیم قابلیت حمل بین پیاده‌سازی‌های JPA را داشته باشیم، نام‌گذاری توالی اهمیت دارد. در غیر این صورت، در صورت عدم وجود خط ۱۹، سه پیاده‌سازی JPA توالی‌هایی ایجاد خواهند کرد که نام یکسانی ندارند و این امر باعث می‌شود که JPA2 نتواند از پایگاه داده‌ای که توسط JPA1 ایجاد شده است، استفاده کند؛

اکنون آماده‌ایم تا پیکربندی [generic-create-dbproduits-eclipselink] را اجرا کنیم:

اجرای این پیکربندی دو شیء ایجاد می‌کند:

  • یک جدول به نام [PRODUITS];
  • یک توالی به نام [PRODUITS_SEQUENCE]

DDL از جدول [PRODUITS] به شرح زیر است:

 

کلید اصلی [ID] به‌صورت خودکار افزایش‌یافته نیست، همان‌طور که در مورد MySQL بود. با این حال، پروژه [spring-jdbc-03] فرض می‌کند که SGBD مسئول تولید کلیدهای اصلی برای جدول [PRODUITS] است. ما یک trigger یا déclencheur ایجاد خواهیم کرد. یک تریگر یک رویهٔ ذخیره‌شده در SGBD است که تحت شرایط خاصی اجرا می‌شود. ما قصد داریم یک تله ایجاد کنیم که برای هر درج جدید، کلید اصلی محصول درج‌شده را از دنباله [PRODUITS_SEQUENCE] که توسط پیکربندی JPA ایجاد شده است، تولید کند.

  • در [6]، تله [PRODUITS_ID_TRIGGER] [4] قبل از هر درج اجرا خواهد شد؛
  • در [7]، یک رویهٔ ذخیره‌شدهٔ اختصاصی برای Oracle SGBD. این مشخص می‌کند که فیلد [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 مورد استفاده دارای استراتژی‌های تولید کلید اصلی زیر هستند:

[Categorie]


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;

[Produit]


public class Produit implements AbstractCoreEntity {
    // ویژگی‌ها
    @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 {
    // ویژگی‌ها
    @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 {
    // ویژگی‌ها
    @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 {
    // ویژگی‌ها
    @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] هستیم:

و نتیجه زیر را به دست می‌آوریم:

  

سپس پنج تله (trigger) برای تولید کلیدهای اصلی پنج جدول ایجاد می‌کنیم:

 

تریگرها به صورت زیر با جدول‌ها مرتبط می‌شوند:

Table
Trigger
Séquence
CATEGORIES
CATEGORIES_ID_TRIGGER
CATEGORIES_SEQUENCE
PRODUITS
PRODUITS_ID_TRIGGER
PRODUITS_SEQUENCE
ROLES
ROLES_ID_TRIGGER
ROLES_SEQUENCE
USERS
USERS_ID_TRIGGER
USERS_SEQUENCE
USERS_ROLES
USERS_ROLES_ID_TRIGGER
USERS_ROLES_SEQUENCE
  

پروژه [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 از SGBD 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>
        <!--وابستگی‌های متغیر ********************************************** -->
        <!-- JDBC درایور برای SGBD -->
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0</version>
        </dependency>
        <!--وابستگی‌های ثابت ********************************************** -->
        ....
    </dependencies>
...
</project>
  • خطوط ۱۸–۲۲: درایور Oracle JDBC جایگزین درایور MySQL می‌شود؛

تغییر دوم در کلاس [ConfigJdbc] است که اعتبارنامه‌های دسترسی به پایگاه داده را تعریف می‌کند:


    // پارامترهای اتصال
    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";

تغییر سوم مربوط به حداکثر تعداد پارامترهایی است که یک می‌تواند پشتیبانی کند:


    // حداکثر تعداد پارامترها برای [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 1000;

آزمون [JUnitTestPushTheLimits] سفارش‌های SQL را برای ۵۰۰۰ محصول تولید می‌کند که به نوبه خود سفارش‌های [PreparedStatement] را با ۵۰۰۰ پارامتر تولید می‌کنند. MySQL می‌توانست از این مقدار پشتیبانی کند، اما Oracle نمی‌توانست. ما این مقدار را به ۱۰۰۰ کاهش دادیم و اکنون کار می‌کند.

 

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، [Alt-F5] را اجرا کنید.

پروژه [oracle-config-jpa-eclipseLink] لایه [JPA] معماری تست را پیکربندی می‌کند:

این پروژه مشابه پروژه پیکربندی [mysql-config-jpa-eclipselink] (به بخش 7.3 مراجعه کنید) از لایه Eclipselink JPA در پروژه SGBD MySQL است. ما فقط تغییرات را برجسته می‌کنیم:

اولین مورد در کلاس [ConfigJpa]، در تعریف bean [jpaVendorAdapter] است:


    // ارائه‌دهنده JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        // توجه: اجزای JPA و پیکربندی EclipseLink در فایل META-INF/persistence.xml قرار دارند.
        EclipseLinkJpaVendorAdapter eclipseLinkJpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
        eclipseLinkJpaVendorAdapter.setShowSql(false);
        eclipseLinkJpaVendorAdapter.setDatabase(Database.ORACLE);
        eclipseLinkJpaVendorAdapter.setGenerateDdl(true);
        return eclipseLinkJpaVendorAdapter;
}
  • خط ۷: به پیاده‌سازی JPA دستور داده شده است که با پایگاه داده Oracle کار کند. پیاده‌سازی JPA سپس هر دو نوع داده اختصاصی و نوع SQL مخصوص Oracle را به کار خواهد گرفت.

تغییر دوم مربوط به استراتژی تولید کلید اصلی است. استراتژی جدید در بخش 10.1 تشریح شده است.

10.4. پیکربندی لایه Hibernate JPA

 

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، دستور [Alt-F5] را اجرا کنید.

پروژه [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. پیکربندی لایه JPA OpenJpa

 

توجه: برای بازتولید مجدد تمام پروژه‌های Maven، [Alt-F5] را اجرا کنید.

پروژه [oracle-config-jpa-openjpa] مشابه پروژه [mysql-config-jpa-openjpa] است (بخش ۸.۳) با همان اصلاحاتی که برای انتقال [mysql-config-jpa-eclipselink] به پروژه [oracle-config-jpa-eclipselink] (بخش ۱۰.۳) استفاده شد.

با اعمال این تغییرات، اجرای پیکربندی [spring-jpa-generic-JUnitTestDao-openjpa] باید با موفقیت انجام شود.