المكتبات والمعايير
52. ما هو السبات؟ ما الفرق بين JPA والإسبات؟
للإجابة على هذا السؤال، أعتقد أننا بحاجة أولاً إلى فهم ما هو JPA. إنها مواصفات تصف التعيين العلائقي للكائنات لكائنات Java البسيطة وتوفر واجهة برمجة التطبيقات (API) لتخزين هذه الكائنات واسترجاعها ومعالجتها. أي أن قواعد البيانات العلائقية (DBs) يتم تمثيلها كمجموعة من الجداول المترابطة. وJPA هو معيار معتمد على نطاق واسع يصف كيفية تفاعل الكائنات مع قواعد البيانات العلائقية. كما ترون، JPA هو شيء مجرد وغير ملموس. إنها مثل الفكرة نفسها، النهج. لكن Hibernate عبارة عن مكتبة محددة تنفذ نماذج JPA. لترتيب الكلمات، يمكنك استخدام هذه المكتبة للعمل مع قاعدة بيانات علائقية من خلال الكائنات التي تمثل البيانات في قاعدة البيانات (الكيان). يقال إن هذه المكتبة قريبة جدًا من مُثُل JPA. ربما هذا هو السبب في أنها أصبحت شعبية. كما يمكنك أن تتخيل، فإن شعبيتها تبرر المزيد من التطوير والتحسينات. بالإضافة إلى ذلك، ينبع الاستخدام الواسع النطاق من مجتمع واسع قام بالفعل باستكشاف كل الأسئلة الممكنة والمستحيلة المتعلقة بهذه الأداة. لقد تمت دراسة السبات بدقة، وكما تبين، فهو موثوق. هناك سبب وجيه وراء استخدام تطبيق JPA المثالي في Spring بشكل عام للإسبات تحت الغطاء.53. ما هو المتتالية؟ كيف يتم استخدامه في السبات؟
كما قلت سابقًا، يحدث الاتصال في وضع السبات من خلال كائنات بيانات تسمى الكيانات. تمثل هذه الكيانات جداول محددة في قاعدة البيانات، وكما تتذكر، يمكن أن تحتوي فئات Java على مراجع لفئات أخرى. وتنعكس هذه العلاقات أيضًا في قاعدة البيانات. وكقاعدة عامة، فهي إما مفاتيح خارجية (لعلاقات OneToOne، وOneToMany، وManyToOne) أو جداول وسيطة (لعلاقات ManyToMany). عندما يكون لدى الكيان الخاص بك مراجع إلى كيانات أخرى ذات صلة، يتم وضع التعليقات التوضيحية فوق هذه المراجع للإشارة إلى نوع العلاقة: @OneToOne، @OneToMany، @ManyToOne، @ManyToMany. يمكنك تحديد نوع التتالي لهذه العلاقة في خاصية التتالي للتعليقات التوضيحية. لدى JPA طرق محددة للتفاعل مع الكيانات (الاستمرار، الحفظ، الدمج ...). تُستخدم الأنواع المتتالية لإظهار كيفية تصرف البيانات ذات الصلة؛ يتم استخدام هذه الأساليب على الكيان المستهدف. إذن ما هي الاستراتيجيات المتتالية (الأنواع المتتالية)؟ يوفر معيار JPA استخدام ستة أنواع متتالية:-
PERSIST - تحدث عمليات الحفظ بشكل متتالي (لطرق الحفظ () والمستمر () ). بمعنى آخر، إذا قمنا بحفظ كيان مرتبط بكيانات أخرى، فسيتم حفظ تلك الكيانات أيضًا في قاعدة البيانات (إذا لم تكن موجودة بالفعل)
-
MERGE - تحدث عمليات التحديث بشكل متتالي (لطريقة الدمج () )
-
REMOVE - تحدث عمليات الحذف بشكل متتالي ( طريقة الإزالة () )
-
الكل - يحتوي على ثلاث عمليات متتالية في وقت واحد - الاستمرار - الدمج - الإزالة
-
DETACH - لا تتم إدارة الكيانات ذات الصلة بواسطة الجلسة ( طريقة الفصل () ). أي أنه عند تغيير بيانات الكيانات ذات الصلة، لا يتم تحديث البيانات الموجودة في قاعدة البيانات تلقائيًا - يتم تحويلها من مستمرة إلى منفصلة (أي لا تتم إدارة الكيان بواسطة JPA)
-
تحديث - في كل مرة يتم فيها تحديث كيان ببيانات من قاعدة البيانات ( تحديث () - يقوم بتحديث الكائنات المنفصلة)، يتم أيضًا تحديث الكيانات المرتبطة به. على سبيل المثال، قمت بطريقة ما بتغيير البيانات المأخوذة من قاعدة البيانات، وتريد استعادة القيم الأصلية. في هذه الحالة، ستجد هذه العملية مفيدة.
-
REPLICATE - يُستخدم عندما يكون لدينا أكثر من مصدر بيانات واحد ونريد مزامنة البيانات (طريقة النسخ المتماثل للإسبات). يجب أن يكون لدى جميع الكيانات معرفات (معرف) لضمان إمكانية إنشائها دون مشاكل (للتأكد من أن نفس الكيان ليس لديه معرفات مختلفة لقواعد بيانات مختلفة)
-
SAVE_UPDATE - الحفظ/الحذف المتتالي (لطريقة saveOrUpdate الخاصة بـ Hibernate )
-
LOCK — عكس العملية المنفصلة : تحويل الكيان المنفصل مرة أخرى إلى الحالة المستمرة، أي أن الجلسة الحالية ستتتبع الكيان مرة أخرى
54. هل يمكن لفئة الكيان أن تكون مجردة؟
وفقًا لـ 2.1 فئة الكيان في مواصفات JPA ، " يمكن أن تكون كل من الفئات المجردة والمحددة كيانات ". لذا، الإجابة هي نعم، يمكن أن تكون الفئة المجردة كيانًا ويمكن تمييزها بالتعليق التوضيحي @Entity.55. ما هو مدير الكيان؟ ما هو المسؤول عنه؟
أولاً، أود أن أشير إلى أن EntityManager هو عنصر حاسم في JPA . يتم استخدامه لتفاعل الكيانات مع قاعدة البيانات. بشكل عام، يتم استدعاء أساليب تفاعل الكيان مع قاعدة البيانات على الكيان (استمرار، دمج، إزالة، فصل)... لكنني ألاحظ أيضًا أن هذا المكون ليس عادةً مفردًا للتطبيق بأكمله. غالبًا ما يكون خفيف الوزن، ويتم حذف واحد وإنشاء آخر جديد باستخدام EntityManagerFactory . إذا قمنا بالتوازي مع JDBC ، حيث يكون EntityManagerFactory مشابهًا لـ DataSource ، فإن EntityManager يشبه Connection . لقد ذكرت سابقًا أن الكيان المستمر هو كيان تتم إدارته بواسطة الاتصال الحالي. تتم إدارة هذا الكيان بواسطة EntityManager ، الذي يرتبط ارتباطًا وثيقًا بالاتصال الحالي، و TransactionManager ، المسؤول عن فتح/إغلاق المعاملات. في الشكل أدناه، يمكنك رؤية دورة حياة الكيان: يقوم EntityManager بإدارة الكيان عندما يكون في المرحلة المُدارة (عندما يكون مستمرًا، نظرًا لأنه متصل بـ EntityManager ). أي أنها ليست جديدة ولم تتم إزالتها أيضًا. عندما يكون الكيان جديدًا أو تمت إزالته، يمكننا القول أنه منفصل أيضًا، لأن EntityManager لا يديره. هناك استراتيجيات مختلفة لـ EntityManager . يمكنك الحصول على EntityManager منفردًا للتطبيق بأكمله أو إنشاء واحد جديد في كل مرة لكل اتصال. إذا كنت تستخدم Spring، فستتم إدارة إنشاء/حذف EntityManager تلقائيًا ضمن الغطاء (ولكن هذا لا يعني أنه لا يمكنك تخصيصه لنفسك ^^). يجب أن أذكر أن واحدًا أو أكثر من مديري الكيانات يشكلون سياقًا مستمرًا . سياق الاستمرارية هو بيئة تتم فيها مزامنة مثيلات الكيانات مع كيانات مماثلة في قاعدة البيانات (كما قلت، هذا يعمل فقط مع الكيانات المستمرة). إذا تعمقت في JPA (الذي أوصي به بشدة)، فسوف تواجه هذا المفهوم كثيرًا.56. ما هي فئة التأكيد؟ لماذا يتم استخدامه؟
لم أسمع عن مثل هذا الفصل في JPA ، لذا سأفترض أن هذا السؤال يشير إلى فصل موجود في مكتبة JUnit والذي يُستخدم لاختبارات الوحدة. في هذه المكتبة، يتم استخدام فئة التأكيد للتحقق من نتائج تنفيذ التعليمات البرمجية ( يعني التأكيد هنا التأكيد على أن لديك حالة/بيانات محددة في موقع محدد في التعليمات البرمجية). على سبيل المثال، لنفترض أنك تختبر طريقة من المفترض أن تقوم بإنشاء قطة. قمت بتشغيل الطريقة وحصلت على بعض النتائج:Cat resultOfTest = createCat();
ولكن عليك التأكد من أنه تم إنشاؤه بشكل صحيح، أليس كذلك؟ لذلك تقوم يدويًا بإنشاء قطة معينة ( expectCat ) باستخدام المعلمات التي تتوقع رؤيتها في القطة التي تم الحصول عليها من طريقة createCat() . ثم تستخدم فئة التأكيد للتحقق من النتائج:
Assert.assertEquals(resultOfTest, expectedCat);
إذا كانت القطط مختلفة، فسيتم طرح خطأ تأكيدي يخبرنا بأننا لم نحصل على النتائج المتوقعة. تحتوي فئة التأكيد على العديد من الطرق المختلفة التي تغطي مجموعة متنوعة من العمليات المفيدة في التحقق من النتائج المتوقعة. وهنا عدد قليل منهم:
-
AssurerTrue(<boolean>) — من المتوقع أن تكون القيمة التي تم تمريرها كوسيطة صحيحة
-
تأكيدFalse(<boolean>) - من المتوقع أن تكون القيمة التي تم تمريرها كوسيطة خاطئة
-
AssurerNotEquals(<object1>, <object2>) - يجب أن تكون الكائنات التي تم تمريرها كوسيطات مختلفة عند مقارنتها باستخدام يساوي ( خطأ )
-
AssurerThrows(<ClassNameOfException>.class, <exceptionObject>) - من المتوقع أن تكون الوسيطة الثانية استثناءً تم طرحه بواسطة الوسيطة الأولى (أي أن الوسيطة الثانية عادةً ما تكون عبارة عن استدعاء أسلوب يجب أن يلقي استثناءً من النوع المطلوب)
خيط
57. وصف فئة سلسلة جافا
String هي فئة Java قياسية مسؤولة عن تخزين ومعالجة قيم السلسلة (تسلسلات الأحرف). إنها فئة غير قابلة للتغيير (كتبت عن غير قابل للتغيير سابقًا هنا )، أي لا يمكن تغيير بيانات كائنات هذه الفئة بعد إنشائها. أود أن أشير على الفور إلى أن فئتي StringBuilder و StringBuffer متطابقتان بشكل أساسي - والفرق الوحيد هو أن أحدهما مخصص للاستخدام في بيئة متعددة مؤشرات الترابط ( StringBuffer ). هذه الفئات تشبه السلسلة ، ولكنها تختلف في أنها قابلة للتغيير . وحتى بعد إنشائها، فإنها تتيح لك تعديل السلاسل التي تمثلها، دون إنشاء كائن جديد. تختلف أساليبهم عن أساليب السلسلة القياسية وهي مصممة لمعالجة السلسلة (هناك سبب يسمونها منشئ).58. ما هي طرق إنشاء كائن سلسلة؟ أين يتم إنشاؤه؟
الطريقة الأكثر شيوعًا لإنشاء سلسلة هي تحديد القيمة التي نريدها بين علامات الاقتباس المزدوجة ببساطة:String str = "Hello World!";
يمكنك أيضًا القيام بذلك بشكل صريح باستخدام new :
String str = new String("Hello World!");
يمكنك أيضًا إنشاء سلسلة من مجموعة من الأحرف:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
يمكننا القيام بذلك عن طريق استدعاء الأسلوب toString على بعض الكائنات:
String str = someObject.toString();
يمكننا القيام بذلك عن طريق استدعاء أي طريقة أخرى تقوم بإرجاع سلسلة. مثال:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
أنت تدرك أنه يمكن أن يكون هناك العديد والعديد من الطرق لإنشاء سلسلة. عندما يتم إنشاء كائن سلسلة ، يتم تخزينه في تجمع سلسلة ، والذي سنناقشه بمزيد من التفصيل في أحد الأسئلة أدناه.
59. كيف يمكنك مقارنة سلسلتين جافا، وكيف يمكنك فرزهما؟
تستخدم Java علامة المساواة المزدوجة ( == ) لإجراء المقارنات. إذا أردنا مقارنة قيم بسيطة مثل ints، فسنستخدمها. لكن هذه الطريقة غير مناسبة لمقارنة الكائنات الكاملة. سيتم فقط مقارنة المراجع، أي ما إذا كانت المراجع تشير إلى نفس الكائن أم لا. هذا يعني أننا إذا قارنا كائنين لهما نفس قيم الحقول باستخدام == ، فسنحصل على خطأ . الحقول لها نفس القيم، ولكن الكائنات نفسها تحتل مواقع مختلفة في الذاكرة. كائنات السلسلة ، على الرغم من بساطتها الخادعة، لا تزال كائنات. المقارنة بينهما باستخدام == ليست مناسبة أيضًا (على الرغم من وجود تجمع سلسلة). الحل المناسب هو طريقة التساوي القياسية لفئة الكائن ، والتي يجب تجاوزها لتعمل بشكل صحيح (افتراضيًا، تستخدم == للمقارنات). تتجاوزها فئة String ، لذلك نستخدم تطبيقها فقط:String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
لقد تحدثنا عن مقارنات للمساواة. الآن سنكتشف مقارنات الفرز. ففي النهاية، إذا أردنا فرز شيء ما، فنحن بحاجة إلى معرفة المبدأ الذي سنستخدمه للفرز. للقيام بذلك، يمكنك استخدام TreeSet ، وهي مجموعة مرتبة قياسية. تعتمد بنية البيانات هذه على خوارزمية الشجرة ذات اللون الأحمر والأسود وتقوم بفرز المجموعة وفقًا لمبدأ الفرز المحدد. كما قلت سابقًا، عليك أن تفهم كيفية فرز الكائنات من نوع معين. لتعيين طريقة المقارنة للفرز، استخدم المقارنات
. تحتاج عادةً إلى تنفيذها للفئات التي تريد فرزها، ولكن في حالة String ، تم تنفيذها بالفعل. وفقًا لذلك، نقوم ببساطة بإضافة سلاسلنا إلى TreeSet ، وسوف يقوم بفرزها لنا:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
إخراج وحدة التحكم:
60. توفير خوارزمية لتحويل سلسلة إلى أحرف. اكتب الكود المقابل
كما قلت سابقًا، تحتوي كائنات السلسلة على الكثير من الطرق المفيدة المختلفة. واحد من هؤلاء هو toCharArray . تقوم هذه الطريقة بتحويل سلسلة إلى مصفوفة أحرف:String str = "Hello world";
char[] charArr = str.toCharArray();
بعد ذلك، لدينا مجموعة من الأحرف التي يمكننا الرجوع إليها حسب الفهرس:
char firstChar = charArr[0]; // H
61. كيف يمكنك تحويل سلسلة إلى مصفوفة بايت والعودة؟ اكتب الكود المقابل
تحتوي فئة السلسلة على طريقة getBytes ، والتي تشبه طريقة toCharArray وتقوم بإرجاع السلسلة كمصفوفة بايت:String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
لقد وصلنا إلى النتيجة المنطقية لمراجعتنا اليوم. شكرا للقراءة!
GO TO FULL VERSION