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:
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.
10.3. Konfiguracja warstwy JPA EclipseLink
![]() | ![]() |
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.
![]() | ![]() |














































