Skip to content

10. Oracle Express 11g release 2

Przechodzimy teraz do przeniesienia na Oracle Express 11g release 2 tego, co zostało wykonane za pomocą skryptu MySQL5.

10.1. Konfiguracja środowiska pracy

10.1.1. Środowisko Eclipse

Będziemy pracować w następującym środowisku Eclipse:

  

Powyższe projekty Oracle znajdują się w folderze [<exemples>/spring-database-config\oracle\eclipse].

Uwaga: należy wykonać polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Uruchom Oracle Express wraz z klientem [OraManager] (patrz punkt 23.6). Wygenerujemy:

  • bazę danych [dbproduits] wraz z projektem [generic-create-dbproduits];
  • bazę [dbproduitscategories] wraz z projektem [generic-create-dbproduitscategories];

10.1.2. Tworzenie użytkowników

Wszystko odbywa się teraz w projekcie [OraManager]. Należy uruchomić projekt Oracle SGBD. Do logowania administratora systemu używamy danych logowania system / system (należy je wcześniej skonfigurować). Utworzymy dwóch użytkowników:

  • [DBPRODUITS / dbproduits], który będzie właścicielem bazy danych [dbproduits];
  • [DBPRODUITSCATEGORIES / dbproduitscategories], który będzie właścicielem bazy [dbproduits];
  • w przypadku [6-7] identyfikatorami są [system / system];
  • w [14]: wpisać dbproduits;
  • w przypadku [16] użytkownik został utworzony, ale nie ma wystarczających uprawnień, aby się zalogować. Przyznamy mu je za pomocą skryptu SQL [17-18];
  • w [19] należy wpisać nazwę użytkownika wielkimi literami;

Powtórzymy tę samą procedurę, aby utworzyć użytkownika [DBPRODUITSCATEGORIES / dbproduitscategories]:

  

10.1.3. Instalacja sterownika JDBC firmy Oracle w repozytorium Maven

Sterownik Oracle JDBC nie jest dostępny w centralnych repozytoriach Maven. Należy go pobrać ze strony Oracle [http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html]:

Po pobraniu należy go zainstalować w lokalnym repozytorium Maven. Odbywa się to za pomocą następującego skryptu:

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

gdzie należy zastąpić [%M2_HOME%] ścieżką do katalogu instalacyjnego Mavena (patrz punkt 23.2). Po wykonaniu tej czynności sterownik JDBC można zaimportować do projektów Maven za pomocą następującej konfiguracji:


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

10.1.4. Generowanie bazy danych [dbproduits]

Teraz, gdy mamy już użytkownika [DBPRODUITS / dbproduits], zalogujemy się do Oracle przy użyciu tych danych logowania:

  • w [6] wpisać dbproduits;
  • w polu [9] należy wpisać nazwę bazy danych [DBPRODUITS], z której będziemy korzystać;

W klasie [ConfigJdbc] projektu [oracle-config-jdbc] stosowane są następujące parametry połączenia:


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

Należy je dostosować do własnej konfiguracji Oracle.

W projekcie [oracle-config-jpa-eclipselink] encja JPA jest zdefiniowana w następujący sposób:

  

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 {

    // pola
    @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;

...
}
  • wiersze 18–19: strategią generowania klucza głównego tabeli [PRODUITS] jest [strategy=GenerationType.SEQUENCE]. W przypadku tabeli MySQL zastosowano strategię [@GeneratedValue(strategy = GenerationType.IDENTITY)]. W Oracle Express 11g strategia ta nie jest dostępna;
  • wiersz 18: wskazano, że klucz główny zostanie uzyskany za pomocą generatora liczb, często nazywanego sekwencjami;
  • wiersz 19: generator sekwencji (atrybut name odwołuje się do generatora z wiersza 18) utworzy sekwencję o nazwie [PRODUITS_SEQUENCE] w bazie [dbproduits]. Ponieważ zależy nam na przenoszalności między implementacjami JPA, ważne jest nadanie nazwy sekwencji. W przeciwnym razie, przy braku wiersza 19, trzy implementacje JPA utworzą sekwencje o różnych nazwach, co uniemożliwi wykorzystanie przez JPA2 bazy utworzonej przez JPA1;

Jesteśmy gotowi do uruchomienia konfiguracji [generic-create-dbproduits-eclipselink]:

Wykonanie tej konfiguracji tworzy dwa obiekty:

  • tabelę o nazwie [PRODUITS];
  • sekwencję o nazwie [PRODUITS_SEQUENCE]

Wartość DDL z tabeli [PRODUITS] jest następująca:

 

Klucz podstawowy [ID] nie jest automatycznie zwiększany, tak jak miało to miejsce w przypadku MySQL. Jednak projekt [spring-jdbc-03] zakłada, że SGBD zajmuje się generowaniem kluczy głównych w tabeli [PRODUITS]. Utworzymy projekt o nazwie trigger lub déclencheur. Wyzwalacz to procedura przechowywana w projekcie SGBD, która uruchamia się pod pewnymi warunkami. Utworzymy wyzwalacz, który przy każdym nowym wstawieniu generuje klucz podstawowy wstawianego produktu na podstawie sekwencji [PRODUITS_SEQUENCE] utworzonej przez konfigurację JPA.

  • w [6] przed każdym wstawieniem zostanie uruchomiony wyzwalacz [PRODUITS_ID_TRIGGER] [4];
  • w [7] – procedura przechowywana specyficzna dla SGBD w Oracle. Wskazuje ona, że pole [ID] w wierszu, który ma zostać wstawiony, musi zostać zainicjowane następującą wartością generatora o nazwie [PRODUITS_SEQUENCE];
 

Baza danych [dbproduits] jest teraz gotowa. Należy wykonać następujące konfiguracje:

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

Wszystkie muszą zakończyć się powodzeniem.

10.1.5. Generowanie bazy danych [dbproduitscategories]

  

Teraz uruchamiamy projekt [generic-create-dbproduitscategories], który wygeneruje bazę [dbproduitscategories]. Wcześniej, w projekcie [OraManager], logujemy się przy użyciu danych logowania z projektu [DBPRODUITSCATEGORIES / dbproduitscategories], aby móc obserwować zmiany wprowadzone w bazie [dbproduitscategories]:

  

Wykorzystywane obiekty JPA mają następujące strategie generowania kluczy głównych:

[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 {
    // właściwości
    @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 {
    // właściwości
    @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 {
    // właściwości
    @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 {
    // właściwości
    @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;

Podobnie jak w przypadku bazy [dbproduits], wygenerowanych zostanie pięć sekwencji. Są one wykorzystywane przez implementacje JPA do generowania kluczy głównych. Implementacje JPA nie wykorzystują wyzwalaczy, tak jak to miało miejsce wcześniej, ale pobierają następny klucz główny z sekwencji. My natomiast wygenerujemy klucze główne również za pomocą wyzwalaczy. Są one niezbędne dla projektu [spring-jdbc-04].

Uruchamiamy konfigurację [generic-create-dbproduitscategories-eclipselink]:

i otrzymujemy następujący wynik:

  

Następnie generujemy pięć wyzwalaczy w celu wygenerowania kluczy głównych dla pięciu tabel:

 

Wyzwalacze są powiązane z tabelami w następujący sposób:

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
  

Projekt [spring-jdbc-04] wymaga, aby kolumna [VERSIONING] miała wartość domyślną w każdej z tabel:

Wykonujemy to dla wszystkich pięciu tabel.

Teraz należy wykonać następujące konfiguracje:

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

Obie powinny zakończyć się powodzeniem.

10.2. Konfiguracja warstwy JDBC

 

Projekt [oracle-config-jdbc] konfiguruje warstwę [JDBC] w następującej architekturze testowej:

Projekt ten jest analogiczny do projektu konfiguracyjnego [mysql-config-jdbc] warstwy JDBC w ramach SGBD MySQL (patrz punkt 3.3). Przedstawiamy jedynie zmiany:

Plik [pom.xml] importuje sterownik JDBC firmy Oracle:


<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>
        <!-- zmienne zależności ********************************************** -->
        <!-- sterownik JDBC dla SGBD -->
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- stałe zależności ********************************************** -->
        ....
    </dependencies>
...
</project>
  • wiersze 18–22: sterownik Oracle o nazwie JDBC zastępuje sterownik o nazwie MySQL;

Druga zmiana dotyczy klasy [ConfigJdbc], która definiuje identyfikatory dostępu do baz danych:


    // parametry połączenia
    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";

Trzecia zmiana dotyczy maksymalnej liczby parametrów, jaką może obsłużyć:


    // maksymalna liczba parametrów dla [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 1000;

Test [JUnitTestPushTheLimits] generuje zlecenia SQL dla 5000 produktów, które z kolei generują zlecenia [PreparedStatement] z 5000 parametrami. MySQL obsługiwał tę wartość, ale Oracle nie. Zmniejszono tę wartość do 1000 i wszystko działa poprawnie.

 

Uwaga: należy uruchomić [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [oracle-config-jpa-eclipseLink] konfiguruje warstwę [JPA] architektury testowej:

Projekt ten jest analogiczny do projektu konfiguracyjnego [mysql-config-jpa-eclipselink] (patrz punkt 7.3) warstwy JPA Eclipselink w ramach SGBD MySQL. Przedstawiamy jedynie zmiany:

Pierwsza znajduje się w klasie [ConfigJpa] w definicji komponentu [jpaVendorAdapter]:


    // dostawca JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        // Uwaga: jednostki JPA oraz konfiguracja Eclipselink znajdują się w pliku META-INF/persistence.xml
        EclipseLinkJpaVendorAdapter eclipseLinkJpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
        eclipseLinkJpaVendorAdapter.setShowSql(false);
        eclipseLinkJpaVendorAdapter.setDatabase(Database.ORACLE);
        eclipseLinkJpaVendorAdapter.setGenerateDdl(true);
        return eclipseLinkJpaVendorAdapter;
}
  • wiersz 7: informujemy implementację JPA, że będzie ona pracować z bazą danych Oracle. Implementacja JPA przyjmie wówczas zarówno własne typy danych, jak i typy danych Oracle.

Druga zmiana dotyczy strategii generowania kluczy głównych. Nowa strategia została przedstawiona w paragrafie 10.1.

10.4. Konfiguracja warstwy Hibernate JPA

 

Uwaga: należy uruchomić [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [oracle-config-jpa-hibernate] jest analogiczny do projektu [mysql-config-jpa-hibernate] (punkt 6.3) i zawiera te same modyfikacje, które zastosowano podczas przenoszenia projektu [mysql-config-jpa-eclipselink] do projektu [oracle-config-jpa-eclipselink] (punkt 10.3).

Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinna zakończyć się powodzeniem.

10.5. Konfiguracja warstwy JPA OpenJpa

 

Uwaga: należy uruchomić [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.

Projekt [oracle-config-jpa-openjpa] jest analogiczny do projektu [mysql-config-jpa-openjpa] (punkt 8.3) i zawiera te same modyfikacje, które zastosowano podczas przenoszenia projektu [mysql-config-jpa-eclipselink] do projektu [oracle-config-jpa-eclipselink] (punkt 10.3).

Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-openjpa] powinna zakończyć się powodzeniem.