Skip to content

10. Oracle Express 11g sürüm 2

Şimdi, MySQL5 ile yapılanların Oracle Express 11g sürüm 2'ye taşınmasını ele alacağız.

10.1. Çalışma ortamının kurulması

10.1.1. Eclipse ortamı

Aşağıdaki Eclipse ortamında çalışacağız:

  

Yukarıdaki Oracle projeleri, [<exemples>/spring-database-config\oracle\eclipse] klasöründe bulunur.

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

Oracle Express'i ve [OraManager] istemcisini başlatın (bkz. paragraf 23.6). Şunları oluşturacağız:

  • [generic-create-dbproduits] projesi ile [dbproduits] veritabanını;
  • [generic-create-dbproduitscategories] projesiyle birlikte [dbproduitscategories] veritabanını;

10.1.2. Kullanıcı Oluşturma

Artık tüm işlemler [OraManager]'te gerçekleşiyor. SGBD Oracle'ı başlatmalıyız. Sistem yöneticisi için system / system kimlik bilgilerini kullanıyoruz (bunu önceden yapılandırmış olmanız gerekir). İki kullanıcı oluşturacağız:

  • [DBPRODUITS / dbproduits], [dbproduits] veritabanının sahibi olacak;
  • [DBPRODUITSCATEGORIES / dbproduitscategories], [dbproduits] veritabanının sahibi olacak;
  • [6-7]'te kimlik numaraları [system / system];
  • [14]'te: dbproduits yazılmalıdır;
  • [16]'te, kullanıcı oluşturulmuş ancak oturum açmak için yeterli haklara sahip değil. Bir komut dosyası yardımıyla ona bu hakları vereceğiz: SQL [17-18];
  • [19]'te, kullanıcı adını büyük harflerle yazın;

Aynı işlemi tekrarlayarak [DBPRODUITSCATEGORIES / dbproduitscategories] kullanıcısını oluşturacağız:

  

10.1.3. Oracle'ın JDBC sürücüsünün Maven deposuna yüklenmesi

Oracle'ın JDBC sürücüsü merkezi Maven depolarında bulunmamaktadır. Bu sürücüyü Oracle'dan indirmek gerekir: [http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html]:

İndirdikten sonra, bunu yerel Maven deposuna yüklemeniz gerekir. Bu, aşağıdaki DOS [install.bat] [2] komut dosyası ile yapılır:

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

burada [%M2_HOME%] yerine Maven kurulum dizininin yolu yazılmalıdır (bkz. paragraf 23.2). Bu işlem tamamlandıktan sonra, JDBC sürücüsü aşağıdaki yapılandırma ile Maven projelerine içe aktarılabilir:


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

10.1.4. [dbproduits] veritabanının oluşturulması

Artık bir [DBPRODUITS / dbproduits] kullanıcımız olduğuna göre, bu kimlik bilgileriyle Oracle'a bağlanacağız:

  • [6] yerine dbproduits yazın;
  • [9] yerine, kullanacağımız [DBPRODUITS] veritabanını girelim;

[oracle-config-jdbc] projesindeki [ConfigJdbc] sınıfında kullanılan bağlantı parametreleri şunlardır:


    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";

Bunları Oracle yapılandırmanıza göre uyarlamanız gerekir.

[oracle-config-jpa-eclipselink] projesinde, JPA varlığı şu şekilde tanımlanmıştır:

  

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 {

    // alanlar
    @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. satırlar: [PRODUITS] tablosunun birincil anahtar oluşturma stratejisi [strategy=GenerationType.SEQUENCE]'tir. MySQL için [@GeneratedValue(strategy = GenerationType.IDENTITY)] stratejisi kullanılmıştı. Oracle Express 11g'de bu strateji kullanılamaz;
  • 18. satır: Birincil anahtarın, genellikle "sekans" olarak adlandırılan bir sayı üreteci aracılığıyla elde edileceği belirtilir;
  • 19. satır: Sıra numarası oluşturucu (name özniteliği, 18. satırdaki oluşturucuya atıfta bulunur), [dbproduits] veritabanında [PRODUITS_SEQUENCE] adlı bir sıra numarası oluşturacaktır. JPA uygulamaları arasında taşınabilirlik istediğimiz için, diziye bir ad vermek önemlidir. Aksi takdirde, 19. satırın bulunmaması durumunda, üç JPA uygulaması aynı ada sahip olmayan diziler oluşturacak ve bu da JPA2'in JPA1 tarafından oluşturulan bir veritabanını kullanmasını imkansız hale getirecektir;

[generic-create-dbproduits-eclipselink] yapılandırmasını çalıştırmaya hazırız:

Bu yapılandırmanın yürütülmesi iki nesne oluşturur:

  • bir [PRODUITS] tablosu;
  • [PRODUITS_SEQUENCE] adlı bir sıra

[PRODUITS] tablosundaki DDL şu şekildedir:

 

[ID] birincil anahtarı, MySQL'te olduğu gibi otomatik olarak artar. Oysa [spring-jdbc-03] projesi, SGBD'in [PRODUITS] tablosunun birincil anahtarlarını oluşturacağını varsaymaktadır. trigger veya déclencheur adında bir proje oluşturacağız. Tetikleyici, SGBD içinde depolanan ve belirli koşullar altında çalışan bir saklı yordamdır. Her yeni ekleme işleminde, JPA yapılandırmasıyla oluşturulan [PRODUITS_SEQUENCE] dizisinden, eklenen ürünün birincil anahtarını oluşturan bir tetikleyici oluşturacağız.

  • [6]'te, her ekleme işleminden önce [PRODUITS_ID_TRIGGER] ve [4] tetikleyicileri çalıştırılacaktır;
  • [7]'te, SGBD Oracle'a özgü bir saklı yordam. Bu, eklenecek satırın [ID] alanının, [PRODUITS_SEQUENCE] adlı jeneratörün aşağıdaki değeriyle başlatılması gerektiğini belirtir;
 

[dbproduits] veritabanı artık hazırdır. Aşağıdaki yapılandırmaları uygulayın:

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

Hepsinin başarılı olması gerekir.

10.1.5. [dbproduitscategories] veritabanının oluşturulması

  

Şimdi, [dbproduitscategories] veritabanını oluşturacak olan [generic-create-dbproduitscategories] projesini çalıştırıyoruz. Bundan önce, [OraManager]'te, [DBPRODUITSCATEGORIES / dbproduitscategories] kimlik bilgileriyle oturum açarak [dbproduitscategories] veritabanında yapılan değişiklikleri gözlemleyebileceğiz:

  

Kullanılan JPA varlıklarının birincil anahtar oluşturma stratejileri şunlardır:

[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 {
    // özellikler
    @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 {
    // özellikler
    @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 {
    // özellikler
    @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 {
    // özellikler
    @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] veritabanında olduğu gibi, beş sekans oluşturulacaktır. Bu sekanslar, JPA uygulamaları tarafından birincil anahtarları oluşturmak için kullanılır. JPA uygulamaları, daha önce yaptığımız gibi tetikleyiciler kullanmaz; bunun yerine bir sonraki birincil anahtarı elde etmek için dizileri sorgular. Biz ise birincil anahtarları yine tetikleyicilerle oluşturacağız. Bunlar, [spring-jdbc-04] projesi için gereklidir.

[generic-create-dbproduitscategories-eclipselink] yapılandırmasını çalıştırıyoruz:

ve şu sonucu elde ediyoruz:

  

Ardından, beş tablonun birincil anahtarlarını oluşturmak için beş tetikleyici oluşturuyoruz:

 

Tetikleyiciler, tablolara şu şekilde eşleştirilir:

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] projesinde, [VERSIONING] sütununun her bir tabloda bir varsayılan değere sahip olması gerekiyor:

Bu işlem beş tablo için de yapılır.

Şimdi, aşağıdaki yapılandırmaları çalıştırın:

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

Her ikisi de başarılı olmalıdır.

10.2. JDBC katmanının yapılandırılması

 

[oracle-config-jdbc] projesi, aşağıdaki test mimarisinin [JDBC] katmanını yapılandırır:

Bu proje, SGBD MySQL'in JDBC katmanına ait [mysql-config-jdbc] yapılandırma projesine benzemektedir (bkz. paragraf 3.3). Burada yalnızca değişiklikleri sunuyoruz:

[pom.xml] dosyası, Oracle'ın JDBC sürücüsünü içe aktarmaktadır:


<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>
        <!-- değişken bağımlılıklar ********************************************** -->
        <!-- SGBD'in JDBC sürücüsü -->
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- sabit bağımlılıklar ********************************************** -->
        ....
    </dependencies>
...
</project>
  • 18-22. satırlar: Oracle'ın JDBC sürücüsü, MySQL sürücüsünün yerini alır;

İkinci değişiklik, veritabanlarına erişim kimliklerini tanımlayan [ConfigJdbc] sınıfındadır:


    // bağlantı parametreleri
    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";

Üçüncü değişiklik, bir sürücüsünün destekleyebileceği maksimum parametre sayısında yapılmıştır:


    // bir [PreparedStatement]'in maksimum parametre sayısı
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 1000;

[JUnitTestPushTheLimits] testi, 5000 ürün üzerinde SQL emirleri oluşturur ve bu emirler 5000 parametre içeren [PreparedStatement]'leri üretir. MySQL bu değeri destekliyordu ancak Oracle desteklemiyordu. Bu değeri 1000'e düşürdük ve işlem başarılı oldu.

 

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

[oracle-config-jpa-eclipseLink] projesi, test mimarisinin [JPA] katmanını yapılandırır:

Bu proje, SGBD ve MySQL'in Eclipselink katmanı olan JPA'teki [mysql-config-jpa-eclipselink] yapılandırma projesine (bkz. paragraf 7.3) benzerdir. Yalnızca değişiklikleri sunuyoruz:

İlki, [ConfigJpa] sınıfında, [jpaVendorAdapter] bean tanımında yer almaktadır:


    // JPA sağlayıcısı
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        // Not: JPA varlıkları ve Eclipselink yapılandırması META-INF/persistence.xml dosyasında bulunur
        EclipseLinkJpaVendorAdapter eclipseLinkJpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
        eclipseLinkJpaVendorAdapter.setShowSql(false);
        eclipseLinkJpaVendorAdapter.setDatabase(Database.ORACLE);
        eclipseLinkJpaVendorAdapter.setGenerateDdl(true);
        return eclipseLinkJpaVendorAdapter;
}
  • 7. satır: JPA uygulamasına, bir Oracle veritabanıyla çalışacağı belirtilir. Böylece JPA uygulaması, hem özel veri türlerini hem de Oracle'a özgü SQL'i benimseyecektir.

İkinci değişiklik, birincil anahtar oluşturma stratejisindedir. Yeni strateji, 10.1. paragrafında açıklanmıştır.

10.4. JPA Hibernate katmanının yapılandırılması

 

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

[oracle-config-jpa-hibernate] projesi, [mysql-config-jpa-hibernate] projesine benzerdir (6.3. paragraf) ile aynıdır ve [mysql-config-jpa-eclipselink] projesinin [oracle-config-jpa-eclipselink] projesine taşınmasında yapılan değişikliklerin aynısı bu projede de uygulanmıştır (10.3. paragraf).

Bu değişiklikler yapıldıktan sonra, [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] yapılandırmasının çalıştırılması başarılı olmalıdır.

10.5. JPA katmanının yapılandırılması OpenJpa

 

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

[oracle-config-jpa-openjpa] projesi, [mysql-config-jpa-openjpa] projesine (8.3. paragraf) ile aynıdır ve [mysql-config-jpa-eclipselink] projesinin [oracle-config-jpa-eclipselink] projesine taşınmasında yapılan değişikliklerin aynısı bu projede de uygulanmıştır (10.3. paragraf).

Bu değişiklikler yapıldıktan sonra, [spring-jpa-generic-JUnitTestDao-openjpa] yapılandırmasının çalıştırılması başarılı olmalıdır.