13. SQL Server 2014
Passiamo ora al trasferimento su SQL Server 2014 di quanto è stato fatto con MySQL.
![]() |
13.1. Configurazione dell’ambiente di lavoro
13.1.1. Ambiente Eclipse
Lavoreremo con il seguente ambiente Eclipse:
![]() |
I progetti SQL Server sopra indicati si trovano nella cartella [<exemples>/spring-database-config\sqlserver\eclipse].
Nota: eseguire [Alt-F5] per rigenerare tutti i progetti Maven.
13.1.2. Generazione dei database
Come già fatto con Oracle e DB2, dovremo installare il driver JDBC di SQL Server nel repository Maven locale.
Il file [install.bat] contiene il seguente codice:
"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=sqljdbc4-3.0.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0
dove [%M2-HOME%] è la cartella di installazione di Maven (cfr. paragrafo 23.2, pagina 466). Dopo questa installazione, il driver JDBC di SQL Server può essere referenziato nei file [pom.xml] tramite la seguente dipendenza:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
Da questo momento in poi, la connessione ai database SQL e SERVER avviene utilizzando le credenziali [sa / msde]. Avviare il server SQL e il relativo client [MsManager] (cfr. paragrafo 23.9).
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() |
- in [1], caricare lo script SQL [<exemples>\spring-database-config\sqlserver\databases\dbproduits.sql] ;
![]() | ![]() |
![]() |
- in [2], non è stato possibile utilizzare la stessa tabella [PRODUITS] per i progetti [spring-jdbc-01 à 03]. Il motivo è che:
- i progetti [spring-jdbc-01 et 02] inseriscono righe con le rispettive chiavi primarie;
- il progetto [spring-jdbc-03] inserisce righe senza chiavi primarie e si aspetta che il progetto SGBD le generi. A tal fine, è necessario che la chiave primaria [ID] sia di tipo [Identity]. Tuttavia, questo tipo in SQL Server supporta solo la generazione automatica delle chiavi primarie e non consente l’inserimento di una riga con una chiave primaria definita dall’utente. Viene quindi segnalato un errore e non sono riuscito a risolverlo. I progetti [spring-jdbc-01 et 02] utilizzano la tabella [PRODUITS] senza generazione automatica delle chiavi primarie. Il progetto [spring-jdbc-03] utilizza la tabella [PRODUITS2] con generazione automatica delle 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];
Devono tutte andare a buon fine.
Generiamo ora la base [dbproduitscategories]. Ripetete per [dbproduitscategories] la procedura eseguita per creare [dbproduits]. Lo script SQL da caricare si trova nella posizione [<exemples>\spring-database-config\sqlserver\databases\ dbproduitscategories.sql];
![]() |
Ora esegui le configurazioni:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
Entrambe devono andare a buon fine.
13.2. Configurazione del livello JDBC
![]() | ![]() |
Il progetto [sqlserver-config-jdbc] configura il livello [JDBC] della seguente architettura di test:
![]() |
Il progetto è analogo al progetto di configurazione [mysql-config-jdbc] del livello JDBC del SGBD MySQL (cfr. paragrafo 3.3). Presentiamo solo le modifiche:
Il file [pom.xml] importa il driver JDBC da SQL Server:
<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>
<!-- dipendenze variabili ********************************************** -->
<!-- driver JDBC del SGBD -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<!-- dipendenze costanti ********************************************** -->
...
</dependencies>
...
</project>
- righe 18-22: il driver JDBC del server SQL;
La seconda modifica riguarda la classe [ConfigJdbc] che definisce gli identificativi di accesso ai database:
// parametri di connessione
public final static String DRIVER_CLASSNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public final static String URL_DBPRODUITS = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=dbproduits";
public final static String USER_DBPRODUITS = "sa";
public final static String PASSWD_DBPRODUITS = "msde";
public final static String URL_DBPRODUITSCATEGORIES = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=dbproduitscategories";
public final static String USER_DBPRODUITSCATEGORIES = "sa";
public final static String PASSWD_DBPRODUITSCATEGORIES = "msde";
La terza modifica che può essere apportata riguarda il numero massimo di parametri che un [PreparedStatement] può supportare:
// numero massimo di parametri di un [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 2000;
Il test [JUnitTestPushTheLimits] genera comandi SQL su 5000 prodotti che a loro volta genereranno [PreparedStatement] con 5000 parametri. MySQL aveva supportato questo valore. Il server SQL ha segnalato un errore indicando che tale limite era fissato a 2100.
La quarta modifica riguarda la tabella utilizzata dal progetto [spring-jdbc-03]. Non è più [PRODUITS] ma [PRODUITS2]:
// ordini SQL [jdbc-03]
public final static String V2_INSERT_PRODUITS = "INSERT INTO PRODUITS2(NOM, CATEGORIE, PRIX, DESCRIPTION) VALUES (?, ?, ?, ?)";
public final static String V2_DELETE_ALLPRODUITS = "DELETE FROM PRODUITS2";
public final static String V2_DELETE_PRODUITS = "DELETE FROM PRODUITS2 WHERE ID=?";
public final static String V2_SELECT_ALLPRODUITS = "SELECT ID, NOM, CATEGORIE, PRIX, DESCRIPTION FROM PRODUITS2";
public final static String V2_SELECT_PRODUIT_BYID = "SELECT NOM, CATEGORIE, PRIX, DESCRIPTION FROM PRODUITS2 WHERE ID=?";
public final static String V2_SELECT_PRODUIT_BYNAME = "SELECT ID, CATEGORIE, PRIX, DESCRIPTION FROM PRODUITS2 WHERE NOM=?";
public final static String V2_UPDATE_PRODUITS = "UPDATE PRODUITS2 SET NOM=?, PRIX=?, CATEGORIE=?, DESCRIPTION=? WHERE ID=?";
13.3. Configurazione del livello JPA OpenJpa
![]() | ![]() |
Il progetto [sqlserver-config-jpa-openjpa] configura il livello [JPA] dell'architettura di test:
![]() |
Il progetto è analogo al progetto di configurazione [mysql-config-jpa-openjpa] del livello JPA OpenJpa del SGBD MySQL (cfr. paragrafo 8.3). Infatti, entrambi i SGBD utilizzano l’annotazione [@GeneratedValue(strategy = GenerationType.IDENTITY)] per generare le chiavi primarie. Ci sono due modifiche da apportare. Si trovano nella definizione del bean [jpaVendorAdapter] della classe [ConfigJpa]:
// il provider JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.SQL_SERVER);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- riga 6: si indica all’implementazione JPA che opererà con un database SQL Server. L'implementazione JPA adotterà quindi sia i tipi di dati proprietari sia il SQL proprietario di questo SGBD.
La seconda modifica riguarda le entità JPA associate alle tabelle [PRODUITS] e [PRODUITS2]:
![]() |
L'entità [Produit] è associata alla tabella [PRODUITS] senza generazione automatica delle chiavi primarie (assenza della notazione [@GeneratedValue]):
@Entity(name = "Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {
// campi
@Id
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
L'entità [Produit2] è associata alla tabella [PRODUITS2] con generazione automatica delle chiavi primarie:
@Entity(name = "Produit2")
@Table(name = ConfigJdbc.TAB_PRODUITS2)
public class Produit2 {
// campi
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
Inoltre, il progetto che genera il database [dbproduits] deve essere modificato per indicare che ora nel database sono presenti due entità JPA:
![]() |
Il file [persistence.xml] viene modificato come segue:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="generic-jpa-entities-dbproduits" transaction-type="RESOURCE_LOCAL">
<!-- entità JPA -->
<class>generic.jpa.entities.dbproduits.Produit</class>
<class>generic.jpa.entities.dbproduits.Produit2</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
</persistence-unit>
</persistence>
Il progetto [generic-create-dbproduits] è comune a tutti i SGBD. Il livello JPA di quelli esaminati in precedenza non conteneva l’entità [Produit2]. Ci si potrebbe quindi chiedere se il fatto di fare riferimento a un'entità JPA inesistente non rischi di causare un errore nel progetto per questi SGBD. I test dimostrano che non è così.
Una volta apportate queste modifiche, l’esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-openjpa] dovrebbe andare a buon fine.
![]() | ![]() |
13.4. Configurazione del livello JPA di Hibernate
![]() | ![]() |
Nota: eseguire [Alt-F5] per rigenerare tutti i progetti Maven.
Il progetto [sqlserver-config-jpa-hibernate] è analogo al progetto [mysql-config-jpa-hibernate] (paragrafo 6.3) con le stesse modifiche che hanno guidato il porting di [mysql-config-jpa-openjpa] al progetto [sqlserver-config-jpa-openjpa] (paragrafo 8.3).
Una volta apportate queste modifiche, l’esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe andare a buon fine.
13.5. Configurazione del livello JPA EclipseLink
![]() | ![]() |
Nota: eseguire [Alt-F5] per rigenerare tutti i progetti Maven.
Il progetto [sqlserver-config-jpa-eclipselink] è analogo al progetto [mysql-config-jpa-eclipselink] (paragrafo 7.3) con le stesse modifiche che hanno guidato il porting di [mysql-config-jpa-openjpa] al progetto [sqlserver-config-jpa-openjpa] (paragrafo 8.3).
Una volta apportate queste modifiche, l'esecuzione della configurazione [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] dovrebbe andare a buon fine.






























