13. SQL Server 2014
ننتقل الآن إلى نقل ما تم تنفيذه مع MySQL إلى SQL Server 2014.
![]() |
13.1. إعداد بيئة العمل
13.1.1. بيئة Eclipse
سنعمل باستخدام بيئة Eclipse التالية:
![]() |
ستجد المشاريع SQL Server المذكورة أعلاه في المجلد [<exemples>/spring-database-config\sqlserver\eclipse].
ملاحظة: قم بتنفيذ الأمر [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.
13.1.2. إنشاء قواعد البيانات
كما تم مع Oracle و DB2، سيتعين علينا تثبيت برنامج التشغيل JDBC الخاص بـ SQL Server في مستودع Maven المحلي.
يحتوي الملف [install.bat] على الكود التالي:
"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=sqljdbc4-3.0.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0
حيث [%M2-HOME%] هو مجلد تثبيت Maven (انظر الفقرة 23.2، الصفحة 466). بعد هذا التثبيت، يمكن الإشارة إلى برنامج التشغيل JDBC الخاص بـ SQL Server في ملفات [pom.xml] من خلال التبعية التالية:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
فيما يلي، يتم الاتصال بقواعد البيانات SQL و SERVER باستخدام بيانات اعتماد [sa / msde]. قم بتشغيل خادم SQL وعميله [MsManager] (انظر الفقرة 23.9).
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() |
- في [1]، قم بتحميل البرنامج النصي SQL [<exemples>\spring-database-config\sqlserver\databases\dbproduits.sql]؛
![]() | ![]() |
![]() |
- في [2]، لم يكن من الممكن استخدام نفس الجدول [PRODUITS] لمشاريع [spring-jdbc-01 à 03]. والسبب في ذلك هو:
- تقوم المشاريع [spring-jdbc-01 et 02] بإدراج سجلات مع مفاتيحها الأساسية؛
- أما المشروع [spring-jdbc-03] فيقوم بإدراج سجلات بدون مفاتيح أساسية ويتوقع أن يقوم المشروع SGBD بإنشاء هذه المفاتيح. ولذلك، يجب أن يكون المفتاح الأساسي [ID] من النوع [Identity]. إلا أن هذا النوع في خادم SQL لا يدعم سوى الإنشاء التلقائي للمفاتيح الأولية ولا يسمح بإدراج سجل بمفتاح أولي يحدده المستخدم. وعندها تظهر رسالة خطأ ولم أتمكن من التغلب عليها. تستخدم المشاريع من النوع [spring-jdbc-01 et 02] الجدول [PRODUITS] دون إنشاء تلقائي للمفاتيح الأولية. أما المشروع [spring-jdbc-03] فيستخدم الجدول [PRODUITS2] مع إنشاء تلقائي للمفاتيح الأولية.
الآن، قم بتنفيذ التكوينات التالية:
- [spring-jdbc-generic-01.IntroJdbc01]؛
- [spring-jdbc-generic-01.IntroJdbc02]؛
- [spring-jdbc-generic-03.JUnitTestDao1]؛
- [spring-jdbc-generic-03.JUnitTestDao2]؛
يجب أن تنجح جميعها.
لنقم الآن بإنشاء القاعدة [dbproduitscategories]. كرر الإجراء الذي تم تنفيذه لإنشاء [dbproduits] مع [dbproduitscategories]. يوجد البرنامج النصي SQL المطلوب تحميله في الموقع [<exemples>\spring-database-config\sqlserver\databases\ dbproduitscategories.sql]؛
![]() |
الآن، قم بتنفيذ الإعدادات التالية:
- [spring-jdbc-generic-04.JUnitTestDao]؛
- [spring-jpa-generic-JUnitTestDao-openjpa]؛
يجب أن تنجح الإعدادات كلاهما.
13.2. إعداد الطبقة JDBC
![]() | ![]() |
يقوم المشروع [sqlserver-config-jdbc] بتكوين الطبقة [JDBC] في بنية الاختبارات التالية:
![]() |
هذا المشروع مشابه لمشروع التهيئة [mysql-config-jdbc] للطبقة JDBC التابعة لـ SGBD MySQL (انظر الفقرة 3.3). ونعرض هنا التعديلات فقط:
يستورد الملف [pom.xml] برنامج التشغيل JDBC من خادم 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>
<!-- التبعيات المتغيرة ********************************************** -->
<!-- برنامج التشغيل JDBC الخاص بـ SGBD -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<!-- التبعيات الثابتة ********************************************** -->
...
</dependencies>
...
</project>
- الأسطر 18-22: برنامج التشغيل JDBC من خادم SQL؛
التعديل الثاني موجود في الفئة [ConfigJdbc] التي تحدد معرّفات الوصول إلى قواعد البيانات:
// معلمات الاتصال
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";
التعديل الثالث الذي يمكن إجراؤه هو تعديل الحد الأقصى لعدد المعلمات التي يمكن أن يدعمها [PreparedStatement]:
// الحد الأقصى لعدد المعلمات في [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 2000;
يُنتج الاختبار [JUnitTestPushTheLimits] أوامر SQL لـ 5000 منتج، والتي ستُنتج بدورها أوامر [PreparedStatement] تحتوي على 5000 معلمة. وكان الاختبار MySQL قد دعم هذه القيمة. أصدر خادم SQL خطأً يشير إلى أن هذا الحد الأقصى يبلغ 2100.
التعديل الرابع هو في الجدول الذي يستخدمه مشروع [spring-jdbc-03]. لم يعد [PRODUITS] بل أصبح [PRODUITS2]:
// الأوامر 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. تكوين الطبقة JPA OpenJpa
![]() | ![]() |
يقوم المشروع [sqlserver-config-jpa-openjpa] بتكوين الطبقة [JPA] في بنية الاختبارات:
![]() |
هذا المشروع مشابه لمشروع التهيئة [mysql-config-jpa-openjpa] للطبقة JPA OpenJpa التابعة لـ SGBD MySQL (انظر الفقرة 8.3). في الواقع، يستخدم كلا المشروعين SGBD التعليق التوضيحي [@GeneratedValue(strategy = GenerationType.IDENTITY)] لتوليد المفاتيح الأولية. هناك تعديلان يجب إجراؤهما. يقع التعديل في تعريف المكون [jpaVendorAdapter] التابع للفئة [ConfigJpa]:
// المزود JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.SQL_SERVER);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- السطر 6: يتم إعلام التنفيذ JPA بأنه سيعمل مع قاعدة بيانات SQL Server. وبالتالي، ستتبنى عملية التنفيذ JPA أنواع البيانات الخاصة و SQL المملوكة لـ SGBD.
التعديل الثاني يتعلق بالكيانات JPA المرتبطة بالجداول [PRODUITS] و [PRODUITS2]:
![]() |
الكيان [Produit] مرتبط بالجدول [PRODUITS] دون إنشاء مفاتيح أساسية تلقائيًا (عدم وجود الرمز [@GeneratedValue]):
@Entity(name = "Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {
// الحقول
@Id
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
الكيان [Produit2] مرتبط بالجدول [PRODUITS2] مع إنشاء المفاتيح الأساسية تلقائيًا:
@Entity(name = "Produit2")
@Table(name = ConfigJdbc.TAB_PRODUITS2)
public class Produit2 {
// الحقول
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;
بالإضافة إلى ذلك، يجب تعديل المشروع الذي ينشئ قاعدة البيانات [dbproduits] للإشارة إلى وجود كيانين JPA في قاعدة البيانات الآن:
![]() |
يتغير الملف [persistence.xml] على النحو التالي:
<?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">
<!-- الكيانات 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>
المشروع [generic-create-dbproduits] مشترك بين جميع ملفات SGBD. لم تكن الطبقة JPA في الملفات التي تمت دراستها سابقًا تحتوي على الكيان [Produit2]. قد يتساءل المرء إذن عما إذا كان الإشارة إلى كيان JPA غير موجود ستؤدي إلى تعطل المشروع بالنسبة لمشاريع SGBD هذه. وتُظهر الاختبارات أن الأمر ليس كذلك.
وبعد إجراء هذه التعديلات، يجب أن ينجح تنفيذ التكوين [spring-jpa-generic-JUnitTestDao-openjpa].
![]() | ![]() |
13.4. تكوين طبقة Hibernate JPA
![]() | ![]() |
ملاحظة: قم بتنفيذ الأمر [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.
مشروع [sqlserver-config-jpa-hibernate] مشابه لمشروع [mysql-config-jpa-hibernate] (الفقرة 6.3) مع نفس التعديلات التي استُخدمت في تحويل [mysql-config-jpa-openjpa] إلى مشروع [sqlserver-config-jpa-openjpa] (الفقرة 8.3).
وبعد إجراء هذه التعديلات، يجب أن ينجح تنفيذ التكوين [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink].
13.5. تكوين الطبقة JPA EclipseLink
![]() | ![]() |
ملاحظة: قم بتنفيذ [Alt-F5] لإعادة إنشاء جميع مشاريع Maven.
مشروع [sqlserver-config-jpa-eclipselink] مشابه لمشروع [mysql-config-jpa-eclipselink] (الفقرة 7.3) مع نفس التعديلات التي استند إليها تحويل المشروع [mysql-config-jpa-openjpa] إلى المشروع [sqlserver-config-jpa-openjpa] (الفقرة 8.3).
وبعد إجراء هذه التعديلات، يجب أن ينجح تنفيذ التكوين [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink].






























