10. Oracle Express 11g release 2
Тепер ми переходимо до перенесення на Oracle Express 11g release 2 того, що було зроблено за допомогою MySQL5.
![]() |
10.1. Налаштування робочого середовища
10.1.1. Середовище Eclipse
Ми працюватимемо з таким середовищем Eclipse:
![]() |
Вищезазначені проекти Oracle знаходяться у папці [<exemples>/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-сервер 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. Встановлення драйвера JDBC від Oracle у репозиторій 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], під’єднаємося до 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 {
// поля
@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: генератор послідовностей (атрибут name посилається на генератор із рядка 18) створить послідовність під назвою [PRODUITS_SEQUENCE] у базі [dbproduits]. Оскільки ми прагнемо забезпечити переносимість між реалізаціями JPA, важливо надати послідовності ім’я. Інакше, за відсутності рядка 19, три реалізації 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] — збережена процедура, властива SGBD 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 мають такі стратегії формування первинних ключів:
[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]:
![]() | ![]() |
і отримуємо такий результат:
![]() |
Далі ми створюємо п’ять тригерів для генерації первинних ключів п’яти таблиць:
![]() |
Тригери пов’язані з таблицями таким чином:
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] імпортує драйвер JDBC від 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>
<!-- змінні залежності ********************************************** -->
<!-- драйвер JDBC для SGBD -->
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>1.0</version>
</dependency>
<!-- постійні залежності ********************************************** -->
....
</dependencies>
...
</project>
- рядки 18–22: драйвер JDBC від Oracle замінює драйвер 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 для 5000 товарів, які, у свою чергу, генерують запити [PreparedStatement] з 5000 параметрами. MySQL підтримував це значення, але Oracle — ні. Ми зменшили це значення до 1000, і тепер все працює.
10.3. Налаштування рівня JPA EclipseLink
![]() | ![]() |
Примітка: виконайте [Alt-F5], щоб перегенерувати всі проекти Maven.
Проєкт [oracle-config-jpa-eclipseLink] налаштовує рівень [JPA] архітектури тестування:
![]() |
Цей проєкт аналогічний проєкту конфігурації [mysql-config-jpa-eclipselink] (див. розділ 7.3) шару JPA Eclipselink у SGBD MySQL. Ми наводимо лише зміни:
Перша — у класі [ConfigJpa] у визначенні біна [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;
}
- рядок 7: реалізацію JPA вказують, що вона працюватиме з базою даних Oracle. Реалізація JPA тоді перейме як власні типи даних, так і власний SQL Oracle.
Друга зміна стосується стратегії генерації первинних ключів. Нова стратегія була представлена в розділі 10.1.
10.4. Налаштування шару JPA Hibernate
![]() | ![]() |
Примітка: виконайте [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. Конфігурація рівня JPA OpenJpa
![]() | ![]() |
Примітка: виконайте [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] має пройти успішно.
![]() | ![]() |














































