13. SQL Server 2014
Przechodzimy teraz do przeniesienia na serwer SQL Server 2014 tego, co zostało wykonane w przypadku MySQL.
![]() |
13.1. Konfiguracja środowiska pracy
13.1.1. Środowisko Eclipse
Będziemy pracować w następującym środowisku Eclipse:
![]() |
Powyższe projekty SQL Server znajdują się w folderze [<exemples>/spring-database-config\sqlserver\eclipse].
Uwaga: należy wykonać polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.
13.1.2. Generowanie baz danych
Podobnie jak w przypadku Oracle i DB2, będziemy musieli zainstalować sterownik JDBC serwera SQL w lokalnym repozytorium Maven.
Plik [install.bat] zawiera następujący kod:
"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=sqljdbc4-3.0.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0
gdzie [%M2-HOME%] to folder instalacyjny Mavena (patrz paragraf 23.2, strona 466). Po zakończeniu instalacji sterownik JDBC serwera SQL można odwołać w plikach [pom.xml] za pomocą następującej zależności:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
W dalszej części połączenia z bazami danych SQL i SERVER odbywają się przy użyciu danych uwierzytelniających [sa / msde]. Uruchom serwer SQL oraz jego klienta [MsManager] (patrz punkt 23.9).
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() |
- w pliku [1] załaduj skrypt SQL [<exemples>\spring-database-config\sqlserver\databases\dbproduits.sql];
![]() | ![]() |
![]() |
- w przypadku [2] nie było możliwe wykorzystanie tej samej tabeli [PRODUITS] dla projektów [spring-jdbc-01 à 03]. Powodem tego jest fakt, że:
- projekty [spring-jdbc-01 et 02] wstawiają wiersze wraz z ich kluczami głównymi;
- projekt [spring-jdbc-03] wstawia wiersze bez kluczy głównych i oczekuje, że projekt SGBD je wygeneruje. W tym celu klucz główny [ID] musi być typu [Identity]. Jednak ten typ w serwerze SQL obsługuje wyłącznie automatyczne generowanie kluczy głównych i nie zezwala na wstawianie wiersza z kluczem głównym ustalonym przez użytkownika. W takim przypadku zgłaszany jest błąd, którego nie udało mi się obejść. Projekty typu [spring-jdbc-01 et 02] wykorzystują tabelę [PRODUITS] bez automatycznego generowania kluczy głównych. Projekt typu [spring-jdbc-03] wykorzystuje tabelę [PRODUITS2] z automatycznym generowaniem kluczy głównych.
Teraz uruchom 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 powinny zakończyć się powodzeniem.
Wygenerujmy teraz bazę [dbproduitscategories]. Powtórz dla [dbproduitscategories] procedurę przeprowadzoną w celu utworzenia [dbproduits]. Skrypt SQL, który należy załadować, znajduje się w lokalizacji [<exemples>\spring-database-config\sqlserver\databases\ dbproduitscategories.sql];
![]() |
Teraz należy wykonać następujące konfiguracje:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
Obie powinny zakończyć się powodzeniem.
13.2. Konfiguracja warstwy JDBC
![]() | ![]() |
Projekt [sqlserver-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 z serwera SQL:
<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.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<!-- stałe zależności ********************************************** -->
...
</dependencies>
...
</project>
- wiersze 18–22: sterownik JDBC z serwera SQL;
Druga zmiana dotyczy klasy [ConfigJdbc], która definiuje identyfikatory dostępu do baz danych:
// parametry połączenia
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";
Trzecią zmianą, jaką można wprowadzić, jest zmiana maksymalnej liczby parametrów, które może obsłużyć [PreparedStatement]:
// maksymalna liczba parametrów dla [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 2000;
Test [JUnitTestPushTheLimits] generuje polecenia SQL dla 5000 produktów, które z kolei wygenerują [PreparedStatement] z 5000 parametrami. MySQL obsłużył tę wartość. Serwer SQL zgłosił błąd wskazujący, że limit ten wynosił 2100.
Czwarta zmiana dotyczy tabeli wykorzystywanej przez projekt [spring-jdbc-03]. Nie jest to już [PRODUITS], lecz [PRODUITS2]:
// polecenia 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. Konfiguracja warstwy JPA OpenJpa
![]() | ![]() |
Projekt [sqlserver-config-jpa-openjpa] konfiguruje warstwę [JPA] architektury testowej:
![]() |
Projekt ten jest analogiczny do projektu konfiguracyjnego [mysql-config-jpa-openjpa] warstwy JPA, OpenJpa, SGBD oraz MySQL (por. punkt 8.3). Oba projekty SGBD wykorzystują adnotację [@GeneratedValue(strategy = GenerationType.IDENTITY)] do generowania kluczy głównych. Należy wprowadzić dwie zmiany. Znajdują się one w definicji bean’a [jpaVendorAdapter] klasy [ConfigJpa]:
// dostawca JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.SQL_SERVER);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- wiersz 6: informujemy implementację JPA, że będzie ona współpracować z bazą SQL Server. Implementacja JPA przejmie wówczas zarówno zastrzeżone typy danych, jak i obiekt SQL, który jest właścicielem tego obiektu SGBD.
Druga zmiana dotyczy encji JPA powiązanych z tabelami [PRODUITS] i [PRODUITS2]:
![]() |
Entyteta [Produit] jest powiązana z tabelą [PRODUITS] bez automatycznego generowania kluczy głównych (brak oznaczenia [@GeneratedValue]):
@Entity(name = "Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {
// pola
@Id
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
Entyteta [Produit2] jest powiązana z tabelą [PRODUITS2] z automatycznym generowaniem kluczy głównych:
@Entity(name = "Produit2")
@Table(name = ConfigJdbc.TAB_PRODUITS2)
public class Produit2 {
// pola
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
Ponadto projekt generujący bazę danych [dbproduits] należy zmodyfikować, aby uwzględnić fakt, że w bazie znajdują się obecnie dwa obiekty JPA:
![]() |
Plik [persistence.xml] zmienia się w następujący sposób:
<?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">
<!-- entities 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>
Projekt [generic-create-dbproduits] jest wspólny dla wszystkich SGBD. Warstwa JPA w przypadku wcześniej analizowanych projektów nie zawierała encji [Produit2]. Można zatem zadać sobie pytanie, czy odwołanie się do nieistniejącej jednostki JPA nie spowoduje awarii projektu dla tych SGBD. Testy wykazują, że nie.
Po wprowadzeniu tych zmian uruchomienie konfiguracji [spring-jpa-generic-JUnitTestDao-openjpa] powinno zakończyć się powodzeniem.
![]() | ![]() |
13.4. Konfiguracja warstwy Hibernate JPA
![]() | ![]() |
Uwaga: należy wykonać polecenie [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.
Projekt [sqlserver-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-openjpa] do projektu [sqlserver-config-jpa-openjpa] (punkt 8.3).
Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinna zakończyć się powodzeniem.
13.5. Konfiguracja warstwy JPA EclipseLink
![]() | ![]() |
Uwaga: należy uruchomić [Alt-F5], aby ponownie wygenerować wszystkie projekty Maven.
Projekt [sqlserver-config-jpa-eclipselink] jest analogiczny do projektu [mysql-config-jpa-eclipselink] (punkt 7.3) i zawiera te same modyfikacje, które miały zastosowanie przy przenoszeniu projektu [mysql-config-jpa-openjpa] do projektu [sqlserver-config-jpa-openjpa] (punkt 8.3).
Po wprowadzeniu tych zmian konfiguracja [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] powinna zakończyć się powodzeniem.






























