13. SQL Server 2014
Vamos agora discutir a adaptação do que foi feito com o MySQL para o SQL Server 2014.
![]() |
13.1. Configurar o ambiente de trabalho
13.1.1. Ambiente Eclipse
Iremos trabalhar com o seguinte ambiente Eclipse:
![]() |
Os projetos do SQL Server acima referidos podem ser encontrados na pasta [<examples>/spring-database-config\sqlserver\eclipse].
Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.
13.1.2. Gerar as bases de dados
Tal como fizemos com o Oracle e o DB2, teremos de instalar o controlador JDBC do SQL Server no repositório local do Maven.
O ficheiro [install.bat] contém o seguinte código:
"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=sqljdbc4-3.0.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0
onde [%M2-HOME%] é o diretório de instalação do Maven (consulte a secção 23.2, página 466). Após esta instalação, o controlador JDBC do SQL Server pode ser referenciado nos ficheiros [pom.xml] utilizando a seguinte dependência:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
Ao longo do resto deste guia, as ligações às bases de dados SQL Server são feitas utilizando as credenciais [sa / msde]. Inicie o SQL Server e o seu cliente [MsManager] (consulte a secção 23.9).
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() |
- Em [1], carregue o script SQL [<examples>\spring-database-config\sqlserver\databases\dbproduits.sql];
![]() | ![]() |
![]() |
- em [2], não foi possível utilizar a mesma tabela [PRODUCTS] para os projetos [spring-jdbc-01 a 03]. A razão é que:
- os projetos [spring-jdbc-01 e 02] inserem linhas com as suas chaves primárias;
- o projeto [spring-jdbc-03] insere linhas sem chaves primárias e espera que o SGBD as gere. Para que isto funcione, a chave primária [ID] deve ser do tipo [Identity]. No entanto, este tipo no SQL Server suporta apenas a geração automática de chaves primárias e não permite a inserção de uma linha com uma chave primária definida pelo utilizador. É então reportado um erro, e não consegui contornar a situação. Os projetos [spring-jdbc-01 e 02] utilizam a tabela [PRODUCTS] sem geração automática de chaves primárias. O projeto [spring-jdbc-03] utiliza a tabela [PRODUCTS2] com geração automática de chaves primárias.
Agora, execute as configurações:
- [spring-jdbc-generic-01.IntroJdbc01];
- [spring-jdbc-generic-01.IntroJdbc02];
- [spring-jdbc-generic-03.JUnitTestDao1];
- [spring-jdbc-generic-03.JUnitTestDao2];
Todos devem ser aprovados.
Agora vamos gerar a base de dados [dbproduitscategories]. Repita o procedimento utilizado para criar [dbproduits] para [dbproduitscategories]. O script SQL a carregar encontra-se em [<examples>\spring-database-config\sqlserver\databases\ dbproduitscategories.sql] ;
![]() |
Agora, execute as configurações:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
Ambas devem ser aprovadas.
13.2. Configurar a camada JDBC
![]() | ![]() |
O projeto [sqlserver-config-jdbc] configura a camada [JDBC] da seguinte arquitetura de teste:
![]() |
O projeto é semelhante ao projeto de configuração [mysql-config-jdbc] para a camada JDBC do SGBD MySQL (ver Secção 3.3). Apresentamos apenas as alterações:
O ficheiro [pom.xml] importa o controlador JDBC do 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>
<!-- dépendances variables ********************************************** -->
<!-- driver JDBC from SGBD -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<!-- dépendances constantes ********************************************** -->
...
</dependencies>
...
</project>
- linhas 18-22: o controlador JDBC do SQL Server;
A segunda alteração está na classe [ConfigJdbc], que define as credenciais da base de dados:
// paramètres de connexion
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";
A terceira modificação que pode ser feita diz respeito ao número máximo de parâmetros que um [PreparedStatement] pode suportar:
// max number of parameters of a [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 2000;
O teste [JUnitTestPushTheLimits] gera instruções SQL para 5 000 produtos, o que irá gerar objetos [PreparedStatement] com 5 000 parâmetros. O MySQL suportou este valor. O SQL Server devolveu um erro indicando que este limite era de 2 100.
A quarta alteração diz respeito à tabela utilizada pelo projeto [spring-jdbc-03]. Já não é a [PRODUCTS], mas sim a [PRODUCTS2]:
// ordres 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. Configurar a camada JPA do OpenJPA
![]() | ![]() |
O projeto [sqlserver-config-jpa-openjpa] configura a camada [JPA] da arquitetura de teste:
![]() |
O projeto é análogo ao projeto de configuração [mysql-config-jpa-openjpa] para a camada JPA do OpenJpa do SGBD MySQL (ver Secção 8.3). Na verdade, ambos os SGBDs utilizam a anotação [@GeneratedValue(strategy = GenerationType.IDENTITY)] para gerar chaves primárias. Há duas alterações a efetuar. Estas encontram-se na definição do bean [jpaVendorAdapter] na classe [ConfigJpa]:
// the provider JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.SQL_SERVER);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- Linha 6: Indicamos à implementação JPA que irá trabalhar com uma base de dados SQL Server. A implementação JPA irá então adotar tanto os tipos de dados proprietários como o SQL proprietário deste SGBD.
A segunda alteração diz respeito às entidades JPA associadas às tabelas [PRODUCTS] e [PRODUCTS2]:
![]() |
A entidade [Product] está associada à tabela [PRODUCTS] sem geração automática de chaves primárias (sem a anotação [@GeneratedValue]):
@Entity(name = "Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {
// fields
@Id
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
A entidade [Product2] está associada à tabela [PRODUCTS2] com geração automática de chaves primárias:
@Entity(name = "Produit2")
@Table(name = ConfigJdbc.TAB_PRODUITS2)
public class Produit2 {
// fields
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
Além disso, o projeto que gera a base de dados [dbproduits] deve ser modificado para indicar que agora existem duas entidades JPA na base de dados:
![]() |
O ficheiro [persistence.xml] é alterado da seguinte forma:
<?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>
O projeto [generic-create-dbproduits] é comum a todos os SGBDs. A camada JPA dos SGBDs analisados anteriormente não possuía a entidade [Product2]. Poder-se-ia questionar, então, se a referência a uma entidade JPA inexistente faria com que o projeto falhasse para esses SGBDs. Os testes demonstram que não.
Com estas alterações efetuadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-openjpa] deverá ser bem-sucedida.
![]() | ![]() |
13.4. Configurar a camada JPA do Hibernate
![]() | ![]() |
Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.
O projeto [sqlserver-config-jpa-hibernate] é análogo ao projeto [mysql-config-jpa-hibernate] (Secção 6.3), com as mesmas modificações que foram utilizadas para portar o projeto [mysql-config-jpa-openjpa] para o projeto [sqlserver-config-jpa-openjpa] (Secção 8.3).
Depois de estas alterações terem sido feitas, a execução da configuração [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] deverá ser bem-sucedida.
13.5. Configurar a camada JPA do EclipseLink
![]() | ![]() |
Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.
O projeto [sqlserver-config-jpa-eclipselink] é análogo ao [mysql-config-jpa-eclipselink] (Secção 7.3), com as mesmas modificações que foram utilizadas para portar o projeto [mysql-config-jpa-openjpa] para o projeto [sqlserver-config-jpa-openjpa] (Secção 8.3).
Com estas modificações implementadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] deverá ser bem-sucedida.






























