12. IBM DB2 Express-C 10.5
Affronteremo ora il porting su DB2 di quanto fatto con MySQL. Entrambi i DBMS utilizzano infatti la stessa strategia per la generazione delle chiavi primarie.
![]() |
12.1. Configurazione dell'ambiente di lavoro
12.1.1. Ambiente Eclipse
Lavoreremo con il seguente ambiente Eclipse:
![]() |
I progetti DB2 sopra elencati si trovano nella cartella [<examples>/spring-database-config\db2\eclipse].
Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.
12.1.2. Generazione dei database
Come abbiamo fatto con Oracle, dovremo installare il driver JDBC di DB2 nel repository Maven locale.
![]() |
Il file [install.bat] contiene il seguente codice:
"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=db2jcc4.jar -Dpackaging=jar -DgroupId=com.ibm.jdbc -DartifactId=db2jcc4 -Dversion=1.0
dove [%M2-HOME%] è la directory di installazione di Maven (vedere la sezione 23.2). Dopo questa installazione, è possibile fare riferimento al driver JDBC DB2 nei file [pom.xml] utilizzando la seguente dipendenza:
<dependency>
<groupId>com.ibm.jdbc</groupId>
<artifactId>db2jcc4</artifactId>
<version>1.0</version>
</dependency>
Nel resto di questa guida, le connessioni ai database DB2 vengono effettuate utilizzando le credenziali [db2admin / db2admin]. Avviare DB2 e il suo client [Db2Manager] (vedere la sezione 23.8).
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() |
Il database [DBPROD] corrisponde al database [dbproduits] del precedente DBMS. Tuttavia, [DB2Manager] non mi ha permesso di utilizzare quel nome (forse perché era troppo lungo). Ora creiamo la tabella [PRODUITS] utilizzando la seguente configurazione di esecuzione di Eclipse [generic-create-dbproduits-jpa]:
![]() | ![]() |
L'esecuzione crea la tabella [PRODUITS] nel database [DBPROD]:
![]() |
- nel punto [1] sopra, la sequenza non è stata generata da [OpenJpa] ma dallo stesso DB2, che la utilizza internamente per generare le chiavi primarie;
Ora, esegui le configurazioni:
- [spring-jdbc-generic-01.IntroJdbc01];
- [spring-jdbc-generic-01.IntroJdbc02];
- [spring-jdbc-generic-03.JUnitTestDao1];
- [spring-jdbc-generic-03.JUnitTestDao2];
Dovrebbero superare tutti i test.
Ora generiamo il database [dbproduitscategories]. Qui verrà chiamato [DBCAT] per i motivi già menzionati riguardo alle restrizioni sulla lunghezza del nome del database. Ripetere la procedura utilizzata per creare [DBPROD] per [DBCAT].
![]() |
Ora creeremo le tabelle per il database [DBCAT] da Eclipse utilizzando la configurazione [generic-create-dbproduitscategories-openjpa]:
![]() | ![]() |
L'esecuzione produce il seguente risultato:
![]() | ![]() |
È necessario modificare la colonna [VERSIONING] delle cinque tabelle in modo che il valore predefinito sia 1:
![]() |
![]() |
Questo passaggio deve essere eseguito per tutte e cinque le tabelle.
Ora, esegui le configurazioni:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
Entrambe dovrebbero superare il test.
12.2. Configurazione del livello JDBC
![]() | ![]() |
Il progetto [db2-config-jdbc] configura il livello [JDBC] della seguente architettura di test:
![]() |
Il progetto è analogo al progetto di configurazione [mysql-config-jdbc] per il livello JDBC del DBMS MySQL (vedi Sezione 3.3). Riportiamo solo le modifiche:
Il file [pom.xml] importa il driver JDBC di DB2:
<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>
<!-- dépendances variables ********************************************** -->
<!-- driver JDBC from SGBD -->
<dependency>
<groupId>com.ibm.jdbc</groupId>
<artifactId>db2jcc4</artifactId>
<version>1.0</version>
</dependency>
<!-- dépendances constantes ********************************************** -->
....
</dependencies>
...
</project>
- righe 18-22: il driver JDBC di DB2;
La seconda modifica riguarda la classe [ConfigJdbc], che definisce le credenziali di accesso al database:
// paramètres de connexion
public final static String DRIVER_CLASSNAME = "com.ibm.db2.jcc.DB2Driver";
public final static String URL_DBPRODUITS = "jdbc:db2://localhost:50000/dbprod";
public final static String USER_DBPRODUITS = "db2admin";
public final static String PASSWD_DBPRODUITS = "db2admin";
public final static String URL_DBPRODUITSCATEGORIES = "jdbc:db2://localhost:50000/dbcat";
public final static String USER_DBPRODUITSCATEGORIES = "db2admin";
public final static String PASSWD_DBPRODUITSCATEGORIES = "db2admin";
La terza modifica che è possibile apportare riguarda il numero massimo di parametri che un [PreparedStatement] può supportare:
// max number of parameters of a [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;
Il test [JUnitTestPushTheLimits] genera istruzioni SQL per 5.000 prodotti, il che comporta la creazione di oggetti [PreparedStatement] con 5.000 parametri. MySQL ha supportato questo valore. Lo stesso vale per DB2.
La quarta modifica riguarda il nome della tabella [ROLES]. Questo nome è riservato nel DBMS DB2. Abbiamo quindi rinominato la tabella [ROLES_]:
public final static String TAB_ROLES = "ROLES_";
public static final String SELECT_ROLES_BYUSERID = "SELECT DISTINCT r.ID as r_ID, r.VERSIONING as r_VERSIONING, r.NAME as r_NAME FROM ROLES_ r, users u, USERS_ROLES ur"
+ " WHERE u.ID=:id AND ur.USER_ID=u.ID AND ur.ROLE_ID=r.ID";
12.3. Configurazione del livello JPA di OpenJPA
![]() | ![]() |
Il progetto [db2-config-jpa-openjpa] configura il livello [JPA] dell'architettura di test:
![]() |
Il progetto è analogo al progetto di configurazione [mysql-config-jpa-openjpa] per il livello JPA OpenJpa del DBMS MySQL (vedere la Sezione 8.3). Infatti, entrambi i DBMS utilizzano l'annotazione [@GeneratedValue(strategy = GenerationType.IDENTITY)] per generare le chiavi primarie. C'è solo una modifica da apportare. Si trova nella definizione del bean [jpaVendorAdapter] nella classe [ConfigJpa]:
// the provider JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.DB2);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- Riga 6: Indichiamo all'implementazione JPA che lavorerà con un database DB2. L'implementazione JPA adotterà quindi sia i tipi di dati proprietari che l'SQL proprietario di questo DBMS.
Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-openjpa] dovrebbe avere esito positivo.
![]() | ![]() |
12.4. Configurazione del livello JPA di Hibernate
![]() | ![]() |
Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.
Il progetto [db2-config-jpa-hibernate] è analogo al progetto [mysql-config-jpa-hibernate] (Sezione 6.3) e presenta le stesse modifiche utilizzate per il porting del progetto [mysql-config-jpa-openjpa] al progetto [db2-config-jpa-openjpa] (Sezione 12.3).
Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe avere esito positivo.
12.5. Configurazione del livello JPA di EclipseLink
![]() | ![]() |
Nota: premere [Alt-F5] per rigenerare tutti i progetti Maven.
Il progetto [db2-config-jpa-eclipselink] è analogo al progetto [mysql-config-jpa-eclipselink] (Sezione 7.3) con le stesse modifiche utilizzate per portare il progetto [mysql-config-jpa-openjpa] al progetto [db2-config-jpa-openjpa] (Sezione 12.3).
Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe avere esito positivo.































