![Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 6-2](https://cdn.javarush.com/images/article/cab15092-c31a-490f-99de-f79b11fef12b/512.jpeg)
Китобхонаҳо ва стандартҳо
52. Гибернат чист? Фарқи байни JPA ва Hibernate чист?
Ман фикр мекунам, ки барои посух додан ба ин савол, мо аввал бояд фаҳмем, ки JPA чист . JPA мушаххасотест, ки харитасозии an objectи марбути an objectҳои Java-ро тавсиф мекунад ва API-ро барои нигоҳдорӣ, дарёфт ва коркарди чунин an objectҳо таъмин мекунад. Яъне, тавре ки мо дар ёд дорем, базаҳои маълумотҳои релятсионӣ (МБ) дар шакли ҷадвалҳои зиёди ба ҳам алоқаманд пешниҳод карда мешаванд. Ва JPA стандарти ба таври васеъ пазируфташуда мебошад, ки тасвир мекунад, ки чӣ гуна an objectҳо метавонанд бо пойгоҳи додаҳои релятсионӣ ҳамкорӣ кунанд. Тавре ки шумо мебинед, JPA чизи абстрактӣ ва ғайримоддӣ аст. Он мисли худи идея, равиш аст.![Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 6-3](https://cdn.javarush.com/images/article/117c78f8-e2bf-4226-8f34-6c2d62a6ac89/512.jpeg)
53. Каскадї чист? Он дар Hibernate чӣ гуна истифода мешавад?
Тавре ки ман қаблан гуфта будам, дар ҳолати интизорӣ муошират тавассути an objectҳои додаҳо бо номи an objectҳо сурат мегирад . Ин an objectҳо баъзе ҷадвалҳои мушаххасро дар пойгоҳи додаҳо муаррифӣ мекунанд ва тавре ки шумо дар ёд доред, дар синфҳои Java метавонанд истинодҳоро ба синфҳои дигар дошта бошанд. Ин муносибатҳо дар базаи маълумот инъикос меёбанд. Дар пойгоҳи додаҳо, чун қоида, инҳо ё калидҳои хориҷӣ (барои OneToOne, OneToMany, ManyToOne) ё ҷадвалҳои мобайнӣ (барои ManyToMany) мебошанд.Шумо метавонед дар бораи муносибати байни an objectҳо дар ин мақола бештар хонед . Вақте ки муассисаи шумо ба дигар an objectҳои алоқаманд пайванд дорад, шарҳҳо дар болои ин истинодҳо барои нишон додани намуди пайваст ҷойгир карда мешаванд: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, ки дар параметрҳои онҳо шумо метавонед арзиши амволро муайян кунед - каскад - навъи каскад барои ин пайваст. JPA дорои усулҳои мушаххаси мутақобила бо an objectҳо мебошад (фосила кардан, захира кардан, якҷоя кардан ...) . Навъҳои каскадӣ дақиқ барои нишон додани он, ки маълумоти алоқаманд ҳангоми истифодаи ин усулҳо дар an objectи мавриди ҳадаф чӣ гуна бояд рафтор кунанд, истифода мешаванд. Пас, стратегияҳои каскадӣ (намудҳои каскад) кадомҳоянд? Стандарти JPA истифодаи шаш намуди каскадро дар назар дорад:-
PERSIST - амалиёти захиракунӣ дар каскад сурат мегирад (барои усулҳои save() ва persist() ). Яъне, агар мо як an objectи бо дигар an objectҳо алоқамандро захира кунем, онҳо низ дар пойгоҳи додаҳо захира карда мешаванд (агар онҳо ҳоло дар он ҷо набошанд)
-
MERGE - амалиёти навсозӣ дар каскад сурат мегирад (барои усули merge() )
-
REMOVE - амалиёти бартарафкунӣ дар каскад сурат мегирад ( усули хориҷ () )
-
ҲАМАИ - якбора се амалиёти каскадиро дар бар мегирад - ИСТИФОДА НАМУДАН - МЕШАВӢ - НАЗАР КАРДАН
-
Объектҳои марбут ба DETACH бо сеанс идора карда намешаванд ( усули detach() ). Яъне, вақте ки онҳо тағир меёбанд, дар маълумоти онҳо дар пойгоҳи додаҳо тағироти автоматӣ ба амал намеояд - онҳо аз ҳолати доимӣ ба ҷудошуда интиқол дода мешаванд (an objectе, ки аз ҷониби JPA идора намешавад)
-
REFRESH - ҳар дафъае, ки an object бо маълумот аз пойгоҳи додаҳо нав карда мешавад ( refresh() - an objectҳои ҷудошударо навсозӣ мекунад), an objectҳои марбут ба ҳамин тарз нав карда мешаванд. Масалан, шумо ягон хел маълумотеро, ки аз базаи маълумот гирифта шудааст, иваз кардаед ва мехоҳед арзишҳои аслии онро баргардонед. Дар ин ҳолат, ин амалиёт барои шумо муфид хоҳад буд.
![Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 6-4](https://cdn.javarush.com/images/article/f9f3623d-4c86-4cbd-a22d-44cd1d5e2c9e/512.jpeg)
-
REPLICATE - Вақте ки мо зиёда аз як манбаи маълумот дорем ва мо мехоҳем, ки маълумот ҳамоҳанг карда шавад, истифода мешавад (Усули интизорӣ - такрорӣ). Ҳама an objectҳо бояд идентификаторҳо (id) дошта бошанд, то ки дар тавлиди онҳо мушкилот ба вуҷуд наояд (то он ки як an object барои пойгоҳи додаҳои гуногун ID-ҳои гуногун надошта бошад)
-
SAVE_UPDATE - каскади захира/нест кардан (барои усули Hibernate - saveOrUpdate )
-
LOCK амалиёти баръакс ба DETACHED аст : он an objectи ҷудошударо ба ҳолати устувор бармегардонад , яъне. an object аз ҷониби сессияи ҷорӣ боз пайгирӣ карда мешавад
54. Оё синфи Entity абстрактӣ буда метавонад?
Дар мушаххасоти JPA дар банди 2.1 Синфи an object сатр мавҷуд аст: " Ҳам синфҳои абстрактӣ ва ҳам мушаххас метавонанд an objectҳо бошанд ." Пас, ҷавоб ҳа аст, синфи абстрактӣ метавонад an object бошад ва онро бо @Entity шарҳ додан мумкин аст.55. Менеҷери субъект чист? Ӯ барои чӣ масъул аст?
Пеш аз ҳама, мехоҳам қайд намоям, ки EntityManager яке аз ҷузъҳои асосии JPA мебошад , ки барои ҳамкории субъектҳо бо пойгоҳи додаҳо истифода мешавад. Дар маҷмӯъ, он усулҳои ҳамкории байни an object ва базаи маълумотро (присист, якҷоякунӣ, нест кардан, ҷудо кардан) меноманд... Аммо ман инчунин қайд мекунам, ки ин компонент, чун қоида, барои тамоми барнома як нест: аксар вақт он сабук аст ва аксар вақт хориҷ карда мешавад ва наваш бо истифода аз EntityManagerFactory сохта мешавад . Агар мо параллелро бо JDBC кашем , ки дар он EntityManagerFactory аналоги DataSource хоҳад буд , пас EntityManager, дар навбати худ, аналоги Пайвастшавӣ хоҳад буд . Пештар ман як воҳиди устуворро ҳамчун an objectе зикр кардам, ки тавассути пайвасти ҷорӣ идора карда мешавад. Ҳамин тавр: ин an object маҳз аз ҷониби EntityManager идора карда мешавад , ки бо пайвасти ҷорӣ ва TransactionManager , ки барои кушодан/пӯшонидани транзаксияҳо масъул аст, зич алоқаманд аст. Илова бар ин дар расми зер шумо метавонед давраи зиндагии an objectро бубинед:![Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 6-5](https://cdn.javarush.com/images/article/fe81f8a3-ff85-4b22-986e-1ca664052373/800.jpeg)
56. Синфи Assert чист? Чаро онро истифода баред?
Ман дар бораи чунин синф дар JPA нашунидаам , бинобар ин ман фикр мекунам, ки ин ба синфи JUnit китобхона дахл дорад, ки барои санҷиши воҳиди code истифода мешавад. Синфи ин китобхона, Assert , барои тафтиши натиҷаҳои иҷроиши code истифода мешавад ( таъкид изҳоротест, ки шумо дар ҷои муайян ҳолат/маълумот доред). Масалан, шумо усулеро меозмоед, ки бояд гурба эҷод кунад. Шумо як усулро иҷро мекунед ва натиҷа мегиред:Cat resultOfTest = createCat();
Аммо шумо бояд боварӣ ҳосил кунед, ки он дуруст офарида шудааст, дуруст? Аз ин рӯ, шумо қаблан як гурбаи муайян - expectCat -ро дастӣ бо параметрҳое, ки шумо аз гурбае, ки аз усули createCat() гирифтаед, интизор будед . Баъдан, шумо синфи Assertро барои тафтиши натиҷаҳо истифода мебаред:
Assert.assertEquals(resultOfTest, expectedCat);
Агар гурбаҳо гуногун бошанд, истиснои AssertionError партофта мешавад , ки ба мо мегӯяд, ки натиҷаҳои интизоршуда ба ҳам намеоянд. Синфи Assert дорои усулҳои гуногуни гуногун мебошад, ки бисёре аз вазифаҳои санҷиши натиҷаҳои интизоршударо дар бар мегирад. Дар ин ҷо баъзе аз онҳо ҳастанд:
-
assertTrue(<boolean>) - арзиши интизоршуда, ки ҳамчун аргумент гирифта мешавад, бояд дуруст бошад
-
assertFalse(<boolean>) - арзиши интизоршуда ҳамчун аргумент бояд бардурӯғ бошад
-
assertNotEquals(<object1>, <object2>) - an objectҳои ҳамчун аргумент гирифташуда бояд ҳангоми муқоиса бо истифода аз баробар ( бардурӯғ ) гуногун бошанд
-
assertThrows(<ClassNameOfException>.class, <exceptionObject>) - интизор меравад, ки аргументи дуюм истиснои синфе бошад, ки аз тарафи аргументи аввал муайян шудааст (яъне, чун қоида, ба ҷои далели дуюм, методе номида мешавад, ки бояд истиснои намуди лозимиро партоед)
Сатр
57. Характеристикаи сатр дар Java
String як синфи стандартӣ дар Java мебошад, ки барои нигоҳдорӣ ва коркарди арзишҳои сатр (пайдарпаймоии аломатҳо) масъул аст, синфи тағирнопазир аст ( ман қаблан дар бораи тағирнопазир навишта будам ), яъне. Маълумоти an objectҳои ин синфро пас аз эҷод кардан тағир додан мумкин нест. Мехоҳам фавран қайд намоям, ки синфҳои StringBuilder ва StringBuffer ду синфи амалан якхелаанд ва ягона фарқият дар он аст, ки яке аз онҳо барои истифода дар муҳити бисёрсоҳавӣ пешбинӣ шудааст (StringBuffer). Ин синфҳо ба String монанданд , аммо бар хилофи он, онҳо тағирёбанда мебошанд . Ин аст, ки an objectҳо пас аз офарида шудан, тағир додани сатри онҳоро бидуни эҷоди an objectи нав иҷозат медиҳанд. Дар асл, усулҳо аз усулҳои стандартии String фарқ мекунанд ва ба қонеъ кардани ниёзҳои тағир додани сатр нигаронида шудаанд (беҳуда нест, ки онҳоро бинокор меноманд). Дар ин мақола дар бораи String , StringBuffer ва StringBuilder маълумоти бештар гиред .58. Роҳҳои гуногуни сохтани an objectи 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 дар ягон an object кор мекунад:
String str = someObject.toString();
Мисли натиҷаи ҳама гуна усули дигар, он намоиши сатрро бармегардонад. Барои намуна:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
Тавре ки шумо фаҳмед, роҳҳои эҷоди сатр метавонад хеле ва хеле зиёд бошад. Вақте ки an objectи String сохта мешавад, он дар ҳавзи сатр нигоҳ дошта мешавад , ки мо дар бораи он дар яке аз саволҳои зер муфассалтар сӯҳбат хоҳем кард.
59. Дар Java ду сатрро чї тавр муќоиса кардан мумкин аст ва онњоро чї тавр људо кардан мумкин аст?
Java барои муқоисаи арзишҳо аломати ду баробар == -ро истифода мебарад . Агар ба мо лозим ояд, ки баъзе арзишҳои оддиро ба мисли int муқоиса кунем , мо онро истифода мебурдем. Аммо ин усул барои муқоисаи an objectҳои мукаммал истифода намешавад. Дар ин ҳолат, он танҳо муқоисаи истинодҳо хоҳад буд - хоҳ онҳо ба як an object ишора мекунанд ё не. Ин аст, ки ҳангоми муқоисаи ду an object бо арзишҳои дақиқи майдонҳои дохилӣ, муқоиса тавассути == натиҷаи нодуруст медиҳад : сарфи назар аз майдонҳои якхелаи an objectҳо, худи an objectҳо ячейкаҳои хотираи гуногунро ишғол мекунанд. Ва an objectҳои синфи String , сарфи назар аз соддагии фиребандаашон, ҳанӯз ҳам an objectҳо мебошанд. Ва муқоиса тавассути == низ барои онҳо мувофиқ нест (ҳатто сарфи назар аз мавҷудияти ҳавзи сатр). Дар ин ҷо усули стандартии синфи Object ба кор медарояд - equals , ки барои дуруст кор кардани он бояд дар синф бекор карда шавад (дар акси ҳол, он бо истифода аз == муқоиса мекунад ). Он дар синфи String бекор карда шудааст , аз ин рӯ мо танҳо онро гирифта истифода мебарем:String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
![Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 6-6](https://cdn.javarush.com/images/article/c4cbf258-2841-4708-843d-e16e59c06bc3/512.jpeg)
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Натиҷаи консол:
60. Алгоритми ба аломат табдил додани сатрро нишон диҳед. Рамзи мувофиқро нависед
Тавре ки ман қаблан гуфтам, an objectҳои синфи String дорои усулҳои гуногуни муфид мебошанд. Яке аз инҳо toCharArray мебошад . Ин усул сатрро ба массиви аломатҳо табдил медиҳад:String str = "Hello world";
char[] charArr = str.toCharArray();
Дар оянда мо як қатор аломатҳо дорем, ки онҳоро аз рӯи индекс даъват карда метавонем:
char firstChar = charArr[0]; // H
61. Чӣ тавр сатрро ба массиви byteӣ ва ақиб табдил додан мумкин аст? Рамзи мувофиқро нависед
Монанди усули toCharArray , синфи String дорои усули getBytes мебошад , ки массиви byteҳои сатрро бармегардонад:String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Бахши имрузаи тахлил мантики ба охир расид. Ба диққататон ташаккур!![Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 6-7](https://cdn.javarush.com/images/article/27b2740d-7749-4a0f-bcc4-3ee9cc5b4884/512.jpeg)
GO TO FULL VERSION