Skip to content

13. SQL Server 2014

We gaan nu verder met de overzetting naar SQL Server 2014 van wat er met MySQL is gedaan.

13.1. Het opzetten van de werkomgeving

13.1.1. Eclipse-omgeving

We gaan werken met de volgende Eclipse-omgeving:

  

De bovenstaande SQL Server-projecten zijn te vinden in de map [<exemples>/spring-database-config\sqlserver\eclipse].

Opmerking: voer [Alt-F5] uit om alle Maven-projecten opnieuw te genereren.

13.1.2. Databases genereren

Net zoals bij Oracle en DB2 moeten we de driver JDBC van de SQL-server in de lokale Maven-repository installeren.

  

Het bestand [install.bat] bevat de volgende code:

"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=sqljdbc4-3.0.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0

waarbij [%M2-HOME%] de installatiemap van Maven is (zie paragraaf 23.2, pagina 466). Na deze installatie kan het stuurprogramma JDBC van SQL Server in de [pom.xml]-bestanden worden aangeroepen via de volgende afhankelijkheid:


        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
</dependency>

Vanaf nu wordt de verbinding met de databases SQL en SERVER tot stand gebracht met de inloggegevens van [sa / msde]. Start de SQL-server en de bijbehorende client [MsManager] (zie paragraaf 23.9).

  • in [1], laad het script SQL [<exemples>\spring-database-config\sqlserver\databases\dbproduits.sql] ;
  • in [2] was het niet mogelijk om dezelfde tabel [PRODUITS] te gebruiken voor de projecten [spring-jdbc-01 à 03]. De reden hiervoor is dat:
    • de projecten [spring-jdbc-01 et 02] voegen rijen in met hun primaire sleutels;
    • het project [spring-jdbc-03] voegt rijen in zonder primaire sleutels en verwacht dat SGBD deze genereert. Hiervoor moet de primaire sleutel van [ID] van het type [Identity] zijn. Dit type ondersteunt in SQL Server echter alleen het automatisch genereren van primaire sleutels en staat het invoegen van een rij met een door de gebruiker vastgestelde primaire sleutel niet toe. Er wordt dan een foutmelding weergegeven en ik heb geen manier gevonden om dit te omzeilen. De projecten [spring-jdbc-01 et 02] maken gebruik van de tabel [PRODUITS] zonder automatische generatie van primaire sleutels. Het project [spring-jdbc-03] maakt gebruik van de tabel [PRODUITS2] met automatische generatie van primaire sleutels.

Voer nu de volgende configuraties uit:

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

Ze moeten allemaal slagen.

Laten we nu de basis [dbproduitscategories] genereren. Herhaal voor [dbproduitscategories] de procedure die is uitgevoerd om [dbproduits] aan te maken. Het te laden script SQL bevindt zich op de locatie [<exemples>\spring-database-config\sqlserver\databases\ dbproduitscategories.sql] ;

  

Voer nu de configuraties uit:

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

Ze moeten allebei slagen.

13.2. Configuratie van de laag JDBC

 

Het project [sqlserver-config-jdbc] configureert de laag [JDBC] van de volgende testarchitectuur:

Het project is vergelijkbaar met het configuratieproject [mysql-config-jdbc] van de laag JDBC van de SGBD MySQL (zie paragraaf 3.3). We geven hier alleen de wijzigingen weer:

Het bestand [pom.xml] importeert de driver JDBC van 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>
        <!-- variabele afhankelijkheden ********************************************** -->
        <!-- stuurprogramma JDBC van de SGBD -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>
        <!-- constante afhankelijkheden ********************************************** -->
        ...
    </dependencies>
...
</project>
  • regels 18-22: de driver JDBC van SQL Server;

De tweede wijziging bevindt zich in de klasse [ConfigJdbc], die de toegangsgegevens voor de databases definieert:


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

De derde wijziging die kan worden aangebracht, betreft het maximale aantal parameters dat een [PreparedStatement] kan ondersteunen:


    // maximaal aantal parameters van een [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 2000;

De test [JUnitTestPushTheLimits] genereert SQL-opdrachten voor 5000 producten, die op hun beurt [PreparedStatement]-bestanden met 5000 parameters zullen genereren. MySQL ondersteunde deze waarde. De SQL-server gaf een foutmelding weer waarin stond dat deze limiet op 2100 lag.

De vierde wijziging betreft de tabel die door het project [spring-jdbc-03] wordt gebruikt. Dit is niet langer [PRODUITS], maar [PRODUITS2]:


    // opdrachten 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. Configuratie van de laag JPA OpenJpa

 

Het project [sqlserver-config-jpa-openjpa] configureert de laag [JPA] van de testarchitectuur:

Het project is vergelijkbaar met het configuratieproject [mysql-config-jpa-openjpa] van de laag JPA OpenJpa van de SGBD MySQL (zie paragraaf 8.3). Beide SGBD-projecten gebruiken namelijk de annotatie [@GeneratedValue(strategy = GenerationType.IDENTITY)] om de primaire sleutels te genereren. Er moeten twee wijzigingen worden aangebracht. Deze staan in de definitie van de bean [jpaVendorAdapter] van de klasse [ConfigJpa]:


    // de provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.SQL_SERVER);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • regel 6: de implementatie JPA wordt geïnformeerd dat deze met een SQL-server zal werken. De implementatie JPA neemt vervolgens zowel de eigen datatypes als de eigen SQL van deze SGBD over.

De tweede wijziging betreft de entiteiten JPA die gekoppeld zijn aan de tabellen [PRODUITS] en [PRODUITS2]:

  

De entiteit [Produit] is gekoppeld aan de tabel [PRODUITS] zonder automatische generatie van primaire sleutels (geen notatie [@GeneratedValue]):


@Entity(name = "Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {

// velden
@Id
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;

De entiteit [Produit2] is gekoppeld aan de tabel [PRODUITS2] met automatische generatie van primaire sleutels:


@Entity(name = "Produit2")
@Table(name = ConfigJdbc.TAB_PRODUITS2)
public class Produit2 {

// velden
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;

Bovendien moet het project dat de database [dbproduits] genereert, worden aangepast om aan te geven dat er nu twee entiteiten JPA in de database staan:

  

Het bestand [persistence.xml] verandert als volgt:


<?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">
        <!-- entiteiten 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>

Het project [generic-create-dbproduits] is gemeenschappelijk voor alle SGBD-entiteiten. De laag JPA van de eerder onderzochte entiteiten bevatte de entiteit [Produit2] niet. Men kan zich dan afvragen of het verwijzen naar een niet-bestaande entiteit JPA het project voor deze SGBD-projecten niet zal doen crashen. Uit tests blijkt dat dit niet het geval is.

Nadat deze wijzigingen zijn doorgevoerd, zou de uitvoering van de configuratie [spring-jpa-generic-JUnitTestDao-openjpa] moeten slagen.

13.4. Configuratie van de Hibernate-laag JPA

 

Opmerking: voer [Alt-F5] uit om alle Maven-projecten opnieuw te genereren.

Het project [sqlserver-config-jpa-hibernate] is vergelijkbaar met het project [mysql-config-jpa-hibernate] (paragraaf 6.3) en bevat dezelfde aanpassingen die zijn doorgevoerd bij de overzetting van [mysql-config-jpa-openjpa] naar het project [sqlserver-config-jpa-openjpa] (paragraaf 8.3).

Als deze wijzigingen zijn doorgevoerd, zou de uitvoering van de configuratie [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] moeten slagen.

 

Opmerking: voer [Alt-F5] uit om alle Maven-projecten opnieuw te genereren.

Het project [sqlserver-config-jpa-eclipselink] is vergelijkbaar met het project [mysql-config-jpa-eclipselink] (paragraaf 7.3) met dezelfde aanpassingen die zijn doorgevoerd bij de overzetting van [mysql-config-jpa-openjpa] naar het project [sqlserver-config-jpa-openjpa] (paragraaf 8.3).

Als deze wijzigingen zijn doorgevoerd, zou de uitvoering van de configuratie [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] moeten slagen.