

کتابخانه ها و استانداردها
52. Hibernate چیست؟ تفاوت بین JPA و Hibernate چیست؟
برای پاسخ به این سوال، فکر می کنم ابتدا باید بدانیم JPA چیست. این مشخصاتی است که یک نگاشت شی-رابطه ای از اشیاء ساده جاوا را توصیف می کند و یک API برای ذخیره، بازیابی و دستکاری چنین اشیایی ارائه می دهد. یعنی پایگاه داده های رابطه ای (DB) به صورت مجموعه ای از جداول به هم پیوسته نمایش داده می شوند. و JPA استانداردی است که به طور گسترده پذیرفته شده است که نحوه تعامل اشیاء با پایگاه داده های رابطه ای را توصیف می کند. همانطور که می بینید، JPA چیزی انتزاعی و ناملموس است. این مانند خود ایده، رویکرد است.
53. آبشاری چیست؟ چگونه در Hibernate استفاده می شود؟
همانطور که قبلاً گفتم، ارتباط در Hibernate از طریق اشیاء داده ای به نام موجودیت ها انجام می شود. این موجودیت ها جداول خاصی را در پایگاه داده نشان می دهند، و همانطور که به یاد دارید، کلاس های جاوا می توانند ارجاعاتی به کلاس های دیگر داشته باشند. این روابط در پایگاه داده نیز منعکس شده است. به عنوان یک قاعده، آنها یا کلیدهای خارجی (برای روابط OneToOne، OneToMany، ManyToOne) یا جداول میانی (برای روابط ManyToMany) هستند. هنگامی که نهاد شما به سایر نهادهای مرتبط ارجاع دارد، حاشیه نویسی در بالای این مراجع قرار می گیرد تا نوع رابطه را نشان دهد: @OneToOne، @OneToMany، @ManyToOne، @ManyToMany. می توانید نوع آبشار این رابطه را در ویژگی آبشار حاشیه نویسی ها مشخص کنید. JPA روش های خاصی برای تعامل با موجودیت ها (تداوم، ذخیره، ادغام ...) دارد. انواع آبشار برای نشان دادن اینکه داده های مرتبط چگونه باید رفتار کنند استفاده می شود. این روش ها بر روی یک موجودیت هدف استفاده می شود. بنابراین استراتژی های آبشاری (انواع آبشاری) چیست؟ استاندارد JPA استفاده از شش نوع آبشار را فراهم می کند:-
PERSIST - عملیات ذخیره در یک آبشار (برای متدهای save() و persist() رخ می دهد . به عبارت دیگر، اگر موجودی را ذخیره کنیم که با موجودیت های دیگر مرتبط است، آن موجودیت ها نیز در پایگاه داده ذخیره می شوند (اگر قبلاً وجود نداشته باشند)
-
MERGE - عملیات به روز رسانی در یک آبشار (برای روش merge() ) رخ می دهد.
-
REMOVE - عملیات حذف در یک روش آبشاری ( روش remove() ) رخ می دهد.
-
ALL - شامل سه عملیات آبشاری به طور همزمان - PERSIST - MERGE - REMOVE
-
DETACH - موجودیت های مرتبط توسط جلسه ( روش detach() ) مدیریت نمی شوند. یعنی زمانی که دادههای موجودیتهای مرتبط تغییر میکنند، دادههای پایگاه داده بهطور خودکار بهروزرسانی نمیشوند - آنها از دائمی به جدا تبدیل میشوند (یعنی موجودیت توسط JPA مدیریت نمیشود)
-
REFRESH - هر بار که یک موجودیت با داده های پایگاه داده ( refresh() refresh می شود - اشیاء جدا شده را تازه می کند، موجودیت های مرتبط با آن نیز به روز می شوند. به عنوان مثال، شما به نوعی داده های گرفته شده از پایگاه داده را تغییر داده اید و می خواهید مقادیر اصلی را بازیابی کنید. در این صورت، این عملیات برای شما مفید خواهد بود.

-
RePLICATE - زمانی استفاده می شود که بیش از یک منبع داده داریم و می خواهیم داده ها همگام شوند (روش تکرار Hibernate). همه نهادها باید شناسه (id) داشته باشند تا اطمینان حاصل شود که بدون مشکل ایجاد می شوند (برای اطمینان از اینکه یک موجودیت شناسه های مختلف برای پایگاه داده های مختلف ندارد)
-
SAVE_UPDATE - ذخیره/حذف آبشاری (برای روش SaveOrUpdate Hibernate )
-
LOCK - برعکس عملیات DETACHED : یک موجودیت جدا شده را به حالت پایدار برمی گرداند، یعنی جلسه فعلی یک بار دیگر موجودیت را ردیابی می کند.
54. آیا یک کلاس Entity می تواند انتزاعی باشد؟
طبق 2.1 کلاس Entity مشخصات JPA ، " کلاس انتزاعی و مشخص می توانند موجودیت باشند. " بنابراین، پاسخ مثبت است، یک کلاس انتزاعی می تواند یک موجودیت باشد و می تواند با حاشیه نویسی @Entity علامت گذاری شود.55. مدیر نهاد چیست؟ مسئول چیست؟
اول از همه، من می خواهم توجه داشته باشم که EntityManager یک جزء حیاتی از JPA است . برای تعامل نهادها با پایگاه داده استفاده می شود. به طور کلی، متدهایی برای تعامل موجودیت با پایگاه داده بر روی موجودیت فراخوانی می شوند (persist, merge, remove, detach)... اما این را نیز متذکر می شوم که این کامپوننت معمولاً برای کل برنامه تکی نیست. اغلب سبک است، یکی حذف می شود، و یک مورد جدید با استفاده از EntityManagerFactory ایجاد می شود . اگر یک موازی با JDBC ترسیم کنیم ، جایی که EntityManagerFactory مشابه DataSource است ، EntityManager مشابه Connection است . قبلاً اشاره کردم که موجودیت پایدار موجودی است که توسط اتصال فعلی مدیریت می شود. این نهاد توسط EntityManager که ارتباط نزدیکی با اتصال فعلی دارد و TransactionManager که مسئول باز کردن/بستن تراکنش ها است مدیریت می شود. در شکل زیر، چرخه حیات موجودیت را می بینید:
56- کلاس Assert چیست؟ چرا استفاده می شود؟
من در مورد چنین کلاسی در JPA نشنیدهام ، بنابراین فرض میکنم که این سؤال به کلاسی در کتابخانه JUnit اشاره دارد که برای تستهای واحد استفاده میشود. در این کتابخانه، کلاس Assert برای بررسی نتایج اجرای کد استفاده می شود (در اینجا assert به معنای ادعایی است که شما وضعیت/داده خاصی را در یک مکان خاص در کد دارید). به عنوان مثال، فرض کنید شما در حال آزمایش روشی هستید که قرار است یک گربه ایجاد کند. شما روش را اجرا می کنید و نتیجه ای می گیرید:Cat resultOfTest = createCat();
اما باید مطمئن شوید که درست ایجاد شده است، درست است؟ بنابراین شما به صورت دستی یک cat خاص ( expectCat ) با دقیقاً پارامترهایی که انتظار دارید در cat بدست آمده از متد ()createCat مشاهده کنید ایجاد می کنید . سپس از کلاس Assert برای تأیید نتایج استفاده می کنید :
Assert.assertEquals(resultOfTest, expectedCat);
اگر گربهها متفاوت باشند، یک AssertionError پرتاب میشود که به ما میگوید نتایج مورد انتظار را نگرفتیم. کلاس Assert روشهای مختلفی دارد که انواع عملیات را پوشش میدهد که در تأیید نتایج مورد انتظار مفید است. در اینجا تعداد کمی از آنها هستند:
-
assertTrue(<boolean>) - انتظار می رود مقدار ارسال شده به عنوان آرگومان درست باشد
-
assertFalse(<boolean>) - انتظار می رود مقدار ارسال شده به عنوان آرگومان نادرست باشد
-
assertNotEquals(<object1>, <object2>) - اشیاء ارسال شده به عنوان آرگومان باید در مقایسه با برابر با ( نادرست ) متفاوت باشند.
-
assertThrows(<ClassNameOfException>.class، <exceptionObject>) — انتظار می رود که آرگومان دوم یک استثنا باشد که توسط آرگومان اول پرتاب می شود (یعنی آرگومان دوم معمولاً یک فراخوانی متدی است که باید استثنایی از نوع مورد نیاز ایجاد کند)
رشته
57. کلاس String جاوا را شرح دهید
String یک کلاس استاندارد جاوا است که مسئول ذخیره و دستکاری مقادیر رشته (توالی کاراکترها) است. این یک کلاس غیرقابل تغییر است ( قبلاً در مورد imutable اینجا نوشتم )، یعنی داده های اشیاء این کلاس پس از ایجاد شدن قابل تغییر نیستند. میخواهم فوراً اشاره کنم که کلاسهای 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 داشته باشیم، از آن استفاده خواهیم کرد. اما این روش برای مقایسه اشیاء تمام عیار مناسب نیست. فقط مراجع را با هم مقایسه می کند، یعنی آیا ارجاعات به یک شی اشاره دارند یا خیر. این بدان معنی است که اگر دو شی با مقادیر فیلد یکسان را با استفاده از == مقایسه کنیم ، false دریافت خواهیم کرد . فیلدها مقادیر یکسانی دارند، اما خود اشیا مکان های متفاوتی در حافظه اشغال می کنند. اشیاء رشته ای ، علیرغم سادگی فریبنده شان، همچنان اشیاء هستند. مقایسه آنها با استفاده از == نیز مناسب نیست (علی رغم وجود استخر رشته). راهحل مناسب، متد برابر استاندارد کلاس Object است که برای درست کار کردن باید رد شود (به طور پیشفرض از == برای مقایسه استفاده میکند). کلاس String آن را لغو می کند، بنابراین ما فقط از پیاده سازی آن استفاده می کنیم: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