

لائبریریاں اور معیارات
52. ہائبرنیٹ کیا ہے؟ جے پی اے اور ہائبرنیٹ میں کیا فرق ہے؟
اس سوال کا جواب دینے کے لیے، میرے خیال میں ہمیں پہلے یہ سمجھنا ہوگا کہ JPA کیا ہے۔ یہ ایک تصریح ہے جو سادہ جاوا آبجیکٹ کی آبجیکٹ-ریلیشنل میپنگ کو بیان کرتی ہے اور ایسی اشیاء کو اسٹور کرنے، بازیافت کرنے اور جوڑ توڑ کے لیے API فراہم کرتی ہے۔ یعنی، رشتہ دار ڈیٹا بیس (DBs) کو باہم مربوط جدولوں کے سیٹ کے طور پر پیش کیا جاتا ہے۔ اور JPA ایک وسیع پیمانے پر اپنایا گیا معیار ہے جو یہ بتاتا ہے کہ اشیاء کس طرح متعلقہ ڈیٹا بیس کے ساتھ تعامل کر سکتی ہیں۔ جیسا کہ آپ دیکھ سکتے ہیں، JPA تجریدی اور غیر محسوس چیز ہے۔ یہ خود خیال، نقطہ نظر کی طرح ہے.
53. جھرن کیا ہے؟ اسے ہائبرنیٹ میں کیسے استعمال کیا جاتا ہے؟
جیسا کہ میں نے پہلے کہا، ہائبرنیٹ میں کمیونیکیشن ڈیٹا آبجیکٹ کے ذریعے ہوتی ہے جسے entities کہتے ہیں۔ یہ ادارے ڈیٹا بیس میں مخصوص جدولوں کی نمائندگی کرتے ہیں، اور جیسا کہ آپ کو یاد ہوگا، جاوا کلاسز دیگر کلاسوں کے حوالے پر مشتمل ہو سکتی ہیں۔ یہ تعلقات ڈیٹا بیس میں بھی جھلکتے ہیں۔ ایک اصول کے طور پر، وہ یا تو غیر ملکی کلیدیں ہیں (OneToOne، OneToMany، ManyToOne رشتوں کے لیے) یا انٹرمیڈیٹ ٹیبلز (ManyToMany رشتوں کے لیے)۔ جب آپ کی ہستی کے پاس دیگر متعلقہ اداروں کے حوالے ہوتے ہیں تو ان حوالوں کے اوپر تشریحات رکھی جاتی ہیں تاکہ تعلق کی قسم کی نشاندہی کی جا سکے: @OneToOne، @OneToMany، @ManyToOne، @ManyToMany۔ آپ تشریحات کی جھرن کی خاصیت میں اس تعلق کے لیے جھرن کی قسم کی وضاحت کر سکتے ہیں۔ JPA کے پاس ہستیوں کے ساتھ تعامل کے لیے مخصوص طریقے ہیں ( برقرار رہنا، محفوظ کرنا، ضم کرنا...)۔ کیسکیڈ کی اقسام کو یہ دکھانے کے لیے استعمال کیا جاتا ہے کہ متعلقہ ڈیٹا کو کیسا برتاؤ کرنا چاہیے۔ یہ طریقے ایک ہدف والے ادارے پر استعمال ہوتے ہیں۔ تو جھرن کی حکمت عملی کیا ہیں (جھرن کی اقسام)؟ JPA معیار چھ جھرنوں کی اقسام کے استعمال کے لیے فراہم کرتا ہے:-
PERSIST - محفوظ کرنے کی کارروائیاں جھرن میں ہوتی ہیں ( seave() اور persist() طریقوں کے لیے۔ دوسرے لفظوں میں، اگر ہم کسی ایسی ہستی کو محفوظ کرتے ہیں جو دیگر اداروں سے وابستہ ہے، تو وہ ہستی بھی ڈیٹا بیس میں محفوظ ہوجاتی ہیں (اگر وہ پہلے سے موجود نہیں ہیں)
-
ضم کریں - اپ ڈیٹ کی کارروائیاں جھرن میں ہوتی ہیں ( ضم () طریقہ کے لیے)
-
ہٹائیں - حذف کرنے کی کارروائیاں جھرن میں ہوتی ہیں ( ہٹائیں() طریقہ)
-
ALL — ایک ساتھ تین کاسکیڈنگ آپریشنز پر مشتمل ہے — PERSIST — ضم کریں — ہٹائیں
-
DETACH — متعلقہ اداروں کا انتظام سیشن ( detach() طریقہ کے ذریعے نہیں کیا جاتا ہے۔ یعنی، جب متعلقہ اداروں کے ڈیٹا کو تبدیل کیا جاتا ہے، ڈیٹا بیس میں موجود ڈیٹا خود بخود اپ ڈیٹ نہیں ہوتا ہے — وہ مستقل سے علیحدہ میں تبدیل ہو جاتا ہے (یعنی ادارے کا انتظام JPA کے ذریعے نہیں کیا جاتا ہے)
-
ریفریش — جب بھی ڈیٹا بیس کے ڈیٹا کے ساتھ کسی ہستی کو تازہ کیا جاتا ہے ( refresh() — علیحدہ اشیاء کو تازہ کرتا ہے، تو اس کے متعلقہ اداروں کو بھی تازہ کیا جاتا ہے۔ مثال کے طور پر، آپ نے ڈیٹا بیس سے لیے گئے ڈیٹا کو کسی نہ کسی طرح تبدیل کر دیا، اور آپ اصل اقدار کو بحال کرنا چاہتے ہیں۔ اس صورت میں، آپ کو یہ آپریشن مفید معلوم ہوگا۔

-
replicate — استعمال کیا جاتا ہے جب ہمارے پاس ایک سے زیادہ ڈیٹا سورس ہوتا ہے اور ہم چاہتے ہیں کہ ڈیٹا کو ہم آہنگ کیا جائے (ہائبرنیٹ کی نقل کا طریقہ)۔ تمام اداروں کے پاس شناخت کنندہ (id) ہونا ضروری ہے تاکہ یہ یقینی بنایا جا سکے کہ انہیں بغیر کسی پریشانی کے بنایا جا سکتا ہے (اس بات کو یقینی بنانے کے لیے کہ ایک ہی ہستی کے پاس مختلف ڈیٹا بیسز کے لیے مختلف ID نہیں ہیں)
-
SAVE_UPDATE — کاسکیڈنگ سیو/ڈیلیٹ (ہائبرنیٹ کے saveOrUpdate طریقہ کے لیے)
-
LOCK — DETACHED آپریشن کے برعکس : ایک علیحدہ ہستی کو دوبارہ مستقل حالت میں تبدیل کرتا ہے، یعنی موجودہ سیشن ایک بار پھر ہستی کو ٹریک کرے گا۔
54. کیا ایک ہستی کی کلاس خلاصہ ہو سکتی ہے؟
جے پی اے کی تصریح کے 2.1 دی اینٹیٹی کلاس کے مطابق ، " خلاصہ اور ٹھوس دونوں کلاسیں ہستی ہو سکتی ہیں۔ " تو، جواب ہاں میں ہے، ایک تجریدی کلاس ایک ہستی ہو سکتی ہے اور اسے @Entity تشریح کے ساتھ نشان زد کیا جا سکتا ہے۔55. ایک ہستی مینیجر کیا ہے؟ اس کا ذمہ دار کیا ہے؟
سب سے پہلے، میں یہ نوٹ کرنا چاہوں گا کہ EntityManager JPA کا ایک اہم جزو ہے ۔ یہ ڈیٹا بیس کے ساتھ اداروں کے تعامل کے لیے استعمال ہوتا ہے۔ عام طور پر، ڈیٹا بیس کے ساتھ ہستی کے تعامل کے طریقوں کو ہستی پر بلایا جاتا ہے (مسلسل ہونا، ضم کرنا، ہٹانا، الگ کرنا)... لیکن میں یہ بھی نوٹ کرتا ہوں کہ یہ جزو عام طور پر پوری ایپلیکیشن کے لیے واحد نہیں ہوتا ہے۔ یہ اکثر ہلکا ہوتا ہے، ایک کو حذف کر دیا جاتا ہے، اور EntityManagerFactory کا استعمال کرتے ہوئے ایک نیا بنایا جاتا ہے ۔ اگر ہم JDBC کے ساتھ متوازی بنائیں ، جہاں EntityManagerFactory DataSource کے مشابہ ہے ، تو EntityManager کنکشن کے مشابہ ہے ۔ اس سے پہلے، میں نے ذکر کیا تھا کہ ایک مستقل وجود ایک ایسی ہستی ہے جو موجودہ کنکشن کے ذریعے منظم ہوتی ہے۔ اس ادارے کا انتظام EntityManager کے ذریعے کیا جاتا ہے ، جو موجودہ کنکشن سے قریبی تعلق رکھتا ہے، اور TransactionManager ، جو کہ لین دین کو کھولنے/ بند کرنے کا ذمہ دار ہے۔ نیچے دی گئی تصویر میں، آپ ہستی کا لائف سائیکل دیکھ سکتے ہیں:
56. Assert کلاس کیا ہے؟ یہ کیوں استعمال کیا جاتا ہے؟
میں نے ایسی کلاس کے بارے میں نہیں سنا ہے JPA ، لہذا میں فرض کروں گا کہ اس سوال سے مراد JUnit لائبریری میں پائی جانے والی کلاس ہے جو یونٹ ٹیسٹ کے لئے استعمال ہوتی ہے۔ اس لائبریری میں، Assert کلاس کا استعمال کوڈ پر عمل درآمد کے نتائج کو چیک کرنے کے لیے کیا جاتا ہے (یہاں assert کا مطلب یہ ہے کہ آپ کے پاس کوڈ میں مخصوص مقام پر مخصوص اسٹیٹ/ڈیٹا ہے)۔ مثال کے طور پر، ہم کہتے ہیں کہ آپ ایک ایسے طریقہ کی جانچ کر رہے ہیں جس کے بارے میں سمجھا جاتا ہے کہ ایک بلی بنائی جائے۔ آپ طریقہ چلاتے ہیں اور آپ کو کچھ نتیجہ ملتا ہے:Cat resultOfTest = createCat();
لیکن آپ کو یہ یقینی بنانے کی ضرورت ہے کہ یہ صحیح طریقے سے بنایا گیا تھا، ٹھیک ہے؟ لہذا آپ دستی طور پر ایک مخصوص cat ( expectedCat ) بالکل ان پیرامیٹرز کے ساتھ بناتے ہیں جو آپ createCat() طریقہ سے حاصل کردہ بلی میں دیکھنے کی توقع کرتے ہیں ۔ پھر آپ نتائج کی تصدیق کے لیے Assert کلاس کا استعمال کرتے ہیں:
Assert.assertEquals(resultOfTest, expectedCat);
اگر بلیاں مختلف ہیں، تو ایک AssertionError پھینک دی جائے گی، جو ہمیں بتاتی ہے کہ ہمیں متوقع نتائج نہیں ملے۔ Assert کلاس میں بہت سے مختلف طریقے ہیں جو متوقع نتائج کی تصدیق کرنے میں مددگار مختلف کارروائیوں کا احاطہ کرتے ہیں ۔ ان میں سے چند یہ ہیں:
-
assertTrue(<boolean>) - دلیل کے طور پر پاس کی گئی قدر کے درست ہونے کی امید ہے۔
-
assertFalse(<boolean>) — دلیل کے طور پر پاس کی گئی قدر کے غلط ہونے کی توقع ہے۔
-
assertNotEquals(<object1>, <object2>) — دلائل کے طور پر پاس کردہ اشیاء کو برابر ( غلط ) کے استعمال سے موازنہ کرتے وقت مختلف ہونا چاہیے
-
assertThrows(<ClassNameOfException>.class, <exceptionObject>) — دوسری دلیل پہلی دلیل کے ذریعہ پھینکی گئی ایک استثناء کی توقع کی جاتی ہے (یعنی دوسری دلیل عام طور پر ایک طریقہ کال ہوتی ہے جس میں مطلوبہ قسم کی رعایت کو پھینکنا چاہئے)
تار
57. جاوا کی سٹرنگ کلاس کی وضاحت کریں۔
سٹرنگ ایک معیاری جاوا کلاس ہے جو سٹرنگ کی قدروں (حروف کی ترتیب) کو ذخیرہ کرنے اور اس میں جوڑ توڑ کے لیے ذمہ دار ہے۔ یہ ایک غیر تبدیل شدہ کلاس ہے (میں نے پہلے یہاں ناقابل تغیر کے بارے میں لکھا تھا )، یعنی اس کلاس کی اشیاء کے ڈیٹا کو ان کے بننے کے بعد تبدیل نہیں کیا جا سکتا۔ میں ابھی نوٹ کرنا چاہوں گا کہ StringBuilder اور StringBuffer کلاسیں بنیادی طور پر ایک جیسی ہیں - فرق صرف یہ ہے کہ ان میں سے ایک کا مقصد ملٹی تھریڈ ماحول ( StringBuffer ) میں استعمال کرنا ہے۔ یہ کلاسیں String کی طرح ہیں ، لیکن اس میں فرق ہے کہ وہ متغیر ہیں ۔ ان کے بننے کے بعد بھی، وہ آپ کو کوئی نیا شے بنائے بغیر، ان کی نمائندگی کرنے والے تاروں میں ترمیم کرنے دیتے ہیں۔ ان کے طریقے معیاری String طریقوں سے مختلف ہیں اور سٹرنگ ہیرا پھیری کے لیے ڈیزائن کیے گئے ہیں (ایک وجہ ہے کہ وہ اسے بلڈر کہتے ہیں)۔58. String آبجیکٹ بنانے کے طریقے کیا ہیں؟ یہ کہاں پیدا ہوا ہے؟
سٹرنگ بنانے کا سب سے عام طریقہ یہ ہے کہ ہم جس قدر کو ڈبل کوٹیشن مارکس میں چاہتے ہیں اس کی وضاحت کرنا ہے: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();
آپ سمجھتے ہیں کہ سٹرنگ بنانے کے بہت سے طریقے ہو سکتے ہیں۔ جب کوئی String آبجیکٹ بنتا ہے، تو اسے سٹرنگ پول میں محفوظ کیا جاتا ہے ، جس پر ہم ذیل میں سے ایک سوال میں مزید تفصیل سے بات کریں گے۔
59. آپ جاوا کے دو تاروں کا موازنہ کیسے کرتے ہیں، اور آپ انہیں کیسے ترتیب دیتے ہیں؟
جاوا موازنہ کرنے کے لیے ڈبل مساوی نشان ( == ) استعمال کرتا ہے۔ اگر ہمیں ints جیسی سادہ اقدار کا موازنہ کرنے کی ضرورت ہے تو ہم اسے استعمال کریں گے۔ لیکن یہ طریقہ مکمل اشیاء کا موازنہ کرنے کے لیے موزوں نہیں ہے۔ یہ صرف حوالہ جات کا موازنہ کرے گا، یعنی آیا حوالہ جات ایک ہی چیز کی طرف اشارہ کرتے ہیں یا نہیں۔ اس کا مطلب یہ ہے کہ اگر ہم ایک ہی فیلڈ ویلیوز کے ساتھ دو آبجیکٹ کا موازنہ کریں == استعمال کرتے ہوئے، ہمیں غلط ملے گا ۔ فیلڈز کی قدریں ایک جیسی ہیں، لیکن آبجیکٹ خود میموری میں مختلف مقامات پر قابض ہیں۔ سٹرنگ آبجیکٹ، اپنی فریب آمیز سادگی کے باوجود، اب بھی اشیاء ہیں۔ == کا استعمال کرتے ہوئے ان کا موازنہ کرنا بھی مناسب نہیں ہے (سٹرنگ پول کی موجودگی کے باوجود)۔ مناسب حل آبجیکٹ کلاس کا معیاری مساوی طریقہ ہے، جسے صحیح طریقے سے کام کرنے کے لیے اوور رائڈ کرنے کی ضرورت ہے (بطور ڈیفالٹ، یہ موازنہ کے لیے == استعمال کرتا ہے)۔ اسٹرنگ کلاس اسے اوور رائیڈ کرتی ہے، لہذا ہم صرف اس کے نفاذ کا استعمال کرتے ہیں :String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);

TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
کنسول آؤٹ پٹ:
60. سٹرنگ کو حروف میں تبدیل کرنے کے لیے الگورتھم فراہم کریں۔ متعلقہ کوڈ لکھیں۔
جیسا کہ میں نے پہلے کہا، String آبجیکٹ میں بہت سے مختلف مفید طریقے ہوتے ہیں۔ ان میں سے ایک ہے toCharArray ۔ یہ طریقہ سٹرنگ کو کریکٹر صف میں تبدیل کرتا ہے:String str = "Hello world";
char[] charArr = str.toCharArray();
اگلا، ہمارے پاس حروف کی ایک صف ہے جسے ہم انڈیکس کے ذریعہ حوالہ دے سکتے ہیں:
char firstChar = charArr[0]; // H
61. آپ سٹرنگ کو بائٹ اری اور بیک میں کیسے تبدیل کرتے ہیں؟ متعلقہ کوڈ لکھیں۔
String کلاس میں getBytes کا طریقہ ہے، جو toCharArray طریقہ سے ملتا جلتا ہے اور سٹرنگ کو بائٹ سرنی کے طور پر لوٹاتا ہے:String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
ہم آج اپنے جائزے کے منطقی نتیجے پر پہنچے ہیں۔ پڑھنے کا شکریہ!
GO TO FULL VERSION