![Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 6 - 1](https://cdn.codegym.cc/images/article/525d3d43-4c36-47aa-a4e9-5c67b73b6cd9/800.jpeg)
![Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 6 - 2](https://cdn.codegym.cc/images/article/eb118476-4ec0-40a7-b64b-98a09a5828a4/512.jpeg)
Biblioteki i standardy
52. Co to jest hibernacja? Jaka jest różnica między JPA a Hibernacją?
Aby odpowiedzieć na to pytanie, myślę, że najpierw musimy zrozumieć, czym jest JPA. Jest to specyfikacja opisująca obiektowo-relacyjne mapowanie prostych obiektów Java i udostępniająca interfejs API do przechowywania, pobierania i manipulowania takimi obiektami. Oznacza to, że relacyjne bazy danych (DB) są reprezentowane jako zbiór połączonych ze sobą tabel. JPA to powszechnie przyjęty standard opisujący sposób, w jaki obiekty mogą wchodzić w interakcję z relacyjnymi bazami danych. Jak widać, JPA jest czymś abstrakcyjnym i nieuchwytnym. Podobnie jak sam pomysł, podejście.![Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 6 - 3](https://cdn.codegym.cc/images/article/dca6e70e-c368-4d1e-9bb3-807f4052efc3/512.jpeg)
53. Co to jest kaskadowanie? Jak jest używany w trybie hibernacji?
Jak powiedziałem wcześniej, komunikacja w Hibernacji odbywa się za pośrednictwem obiektów danych zwanych jednostkami. Podmioty te reprezentują określone tabele w bazie danych i, jak pamiętasz, klasy Java mogą zawierać odniesienia do innych klas. Zależności te znajdują także odzwierciedlenie w bazie danych. Z reguły są to klucze obce (dla relacji OneToOne, OneToMany, ManyToOne) lub tabele pośrednie (dla relacji ManyToMany). Jeśli Twoja encja posiada odniesienia do innych powiązanych encji, nad tymi odniesieniami umieszczane są adnotacje wskazujące typ relacji: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. Możesz określić typ kaskady dla tej relacji we właściwości kaskady adnotacji. JPA ma specyficzne metody interakcji z jednostkami (utrwalanie, zapisywanie, łączenie ...). Typy kaskadowe służą do pokazania, jak powinny zachowywać się powiązane dane; metody te są stosowane w jednostce docelowej. Jakie są zatem strategie kaskadowe (typy kaskadowe)? Standard JPA przewiduje zastosowanie sześciu typów kaskad:-
PERSIST — operacje zapisu odbywają się kaskadowo (dla metod save() i Persist() ). Innymi słowy, jeśli zapiszemy encję, która jest powiązana z innymi encjami, to te encje również zostaną zapisane w bazie danych (o ile ich jeszcze tam nie ma)
-
MERGE — operacje aktualizacji odbywają się kaskadowo (dla metody merge() )
-
REMOVE — operacje usuwania odbywają się kaskadowo ( metoda usuwania() )
-
ALL — zawiera trzy operacje kaskadowe na raz — PERSIST — MERGE — USUŃ
-
DETACH — powiązane podmioty nie są zarządzane przez sesję ( metoda detach() ). Oznacza to, że w przypadku zmiany danych podmiotów powiązanych dane w bazie danych nie są automatycznie aktualizowane – są one konwertowane z trwałych na odłączone (tj. podmiot nie jest zarządzany przez JPA)
-
ODŚWIEŻ — za każdym razem, gdy encja jest odświeżana danymi z bazy danych ( odświeżanie() — odświeża odłączone obiekty), odświeżane są także powiązane z nią encje. Przykładowo zmieniłeś w jakiś sposób dane pobrane z bazy danych i chcesz przywrócić oryginalne wartości. W takim przypadku ta operacja będzie przydatna.
![Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 6 - 4](https://cdn.codegym.cc/images/article/9516ab6c-b3ca-4cf0-a5f0-27a5ff4476c4/512.jpeg)
-
REPLICATE — stosowany, gdy mamy więcej niż jedno źródło danych i chcemy, aby dane były synchronizowane (metoda replikacji Hibernate). Wszystkie encje muszą posiadać identyfikatory (id), aby mieć pewność, że można je utworzyć bez problemów (aby mieć pewność, że ten sam podmiot nie będzie miał różnych identyfikatorów dla różnych baz danych)
-
SAVE_UPDATE — kaskadowe zapisywanie/usuwanie (dla metody saveOrUpdate Hibernate )
-
LOCK — przeciwieństwo operacji DETACHED : konwertuje odłączony obiekt z powrotem do stanu trwałego, tzn. bieżąca sesja będzie ponownie śledzić obiekt
54. Czy klasa Entity może być abstrakcyjna?
Zgodnie z rozdziałem 2.1 Klasa encji specyfikacji JPA : „ Jednymi obiektami mogą być zarówno klasy abstrakcyjne, jak i konkretne ”. Zatem odpowiedź brzmi: tak, klasa abstrakcyjna może być bytem i może być oznaczona adnotacją @Entity.55. Kim jest menadżer podmiotu? Za co jest odpowiedzialny?
Przede wszystkim chciałbym zauważyć, że EntityManager jest kluczowym elementem JPA . Służy do interakcji podmiotów z bazą danych. Ogólnie metody interakcji encji z bazą danych wywoływane są na encji (utrwalanie, łączenie, usuwanie, odłączanie)... Ale zauważam też, że ten komponent zwykle nie jest singletonem dla całej aplikacji. Często jest lekki, jeden jest usuwany i tworzony jest nowy przy użyciu EntityManagerFactory . Jeśli narysujemy porównanie z JDBC , gdzie EntityManagerFactory jest analogiczne do DataSource , wówczas EntityManager jest analogiczne do Connection . Wcześniej wspomniałem, że byt trwały to byt zarządzany przez bieżące połączenie. Encja ta jest zarządzana przez EntityManager , który jest ściśle powiązany z bieżącym połączeniem, oraz TransactionManager , który odpowiada za otwieranie/zamykanie transakcji. Na poniższym rysunku możesz zobaczyć cykl życia encji:![Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 6 - 5](https://cdn.codegym.cc/images/article/ceb2119f-929d-45a4-96ba-aad9800fcd79/800.jpeg)
56. Co to jest klasa Assert? Dlaczego jest używany?
Nie słyszałem o takiej klasie w JPA , więc założę, że to pytanie odnosi się do klasy znalezionej w bibliotece JUnit, która jest używana do testów jednostkowych. W tej bibliotece klasa Assert służy do sprawdzania wyników wykonania kodu (tutaj Assert oznacza potwierdzenie, że masz określony stan/dane w określonym miejscu w kodzie). Załóżmy na przykład, że testujesz metodę, która ma stworzyć kota. Uruchamiasz metodę i otrzymujesz wynik:
Cat resultOfTest = createCat();
Ale trzeba mieć pewność, że został stworzony poprawnie, prawda? Zatem ręcznie tworzysz konkretnego kota ( oczekiwanyCat ) z dokładnie takimi parametrami, jakie spodziewasz się u kota uzyskanego za pomocą metody createCat() . Następnie użyj klasy Assert , aby zweryfikować wyniki:
Assert.assertEquals(resultOfTest, expectedCat);
Jeśli koty są różne, zostanie zgłoszony błąd AssertionError , który mówi nam, że nie uzyskaliśmy oczekiwanych rezultatów. Klasa Assert posiada wiele różnych metod obejmujących różnorodne operacje pomocne w weryfikacji oczekiwanych wyników. Oto kilka z nich:
-
AssertTrue(<boolean>) — oczekuje się, że wartość przekazana jako argument będzie prawdziwa
-
AssertFalse(<boolean>) — oczekuje się, że wartość przekazana jako argument będzie fałszywa
-
AssertNotEquals(<object1>, <object2>) — obiekty przekazane jako argumenty muszą się różnić przy porównywaniu przy użyciu równości ( false )
-
AssertThrows(<ClassNameOfException>.class, <exceptionObject>) — oczekuje się, że drugi argument będzie wyjątkiem zgłoszonym przez pierwszy argument (tj. drugi argument jest zwykle wywołaniem metody, które powinno zgłosić wyjątek wymaganego typu)
Strunowy
57. Opisz klasę String w Javie
String to standardowa klasa Java odpowiedzialna za przechowywanie i manipulowanie wartościami ciągów (sekwencji znaków). Jest to klasa niezmienna (o immutable pisałem wcześniej tutaj ), tzn. danych obiektów tej klasy nie da się zmienić po ich utworzeniu. Od razu zaznaczę, że klasy StringBuilder i StringBuffer są w zasadzie identyczne — jedyną różnicą jest to, że jedna z nich jest przeznaczona do użytku w środowisku wielowątkowym ( StringBuffer ). Klasy te są podobne do String , ale różnią się tym, że można je modyfikować . Nawet po ich utworzeniu pozwalają modyfikować ciągi, które reprezentują, bez tworzenia nowego obiektu. Ich metody różnią się od standardowych metod String i są przeznaczone do manipulacji ciągami (nie bez powodu nazywają to konstruktorem).58. Jakie są sposoby na utworzenie obiektu String? Gdzie jest tworzony?
Najczęstszym sposobem tworzenia ciągu jest określenie żądanej wartości w podwójnym cudzysłowie:
String str = "Hello World!";
Możesz to również zrobić jawnie, używając new :
String str = new String("Hello World!");
Możesz także utworzyć ciąg znaków z tablicy znaków:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Możemy to zrobić wywołując metodę toString na jakimś obiekcie:
String str = someObject.toString();
Możemy to zrobić wywołując dowolną inną metodę zwracającą ciąg znaków. Przykład:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
Rozumiesz, że może być wiele, wiele sposobów na utworzenie ciągu. Kiedy tworzony jest obiekt String , jest on przechowywany w puli ciągów , co omówimy bardziej szczegółowo w jednym z poniższych pytań.
59. Jak porównać dwa ciągi znaków Java i jak je posortować?
Java używa podwójnego znaku równości ( == ) do wykonywania porównań. Jeśli będziemy musieli porównać proste wartości, takie jak int, użyjemy go. Ale ta metoda nie nadaje się do porównywania pełnoprawnych obiektów. Porówna jedynie odniesienia, tj. to, czy odniesienia wskazują na ten sam obiekt, czy nie. Oznacza to, że jeśli porównamy dwa obiekty z tymi samymi wartościami pól za pomocą == , otrzymamy false . Pola mają te same wartości, ale same obiekty zajmują różne miejsca w pamięci. Obiekty typu string , pomimo swojej zwodniczej prostoty, nadal są obiektami. Porównywanie ich za pomocą == również nie jest właściwe (pomimo obecności puli ciągów). Właściwym rozwiązaniem jest standardowa metoda równości klasy Object , którą należy nadpisać, aby działała poprawnie (domyślnie do porównań używana jest metoda == ). Klasa String zastępuje ją, więc po prostu używamy jej implementacji:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
![Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 6 - 6](https://cdn.codegym.cc/images/article/aa886bff-7bf8-4cf2-b27e-9c62dd442c0e/512.jpeg)
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Wyjście konsoli:
60. Podaj algorytm konwersji ciągu znaków na znaki. Napisz odpowiedni kod
Jak powiedziałem wcześniej, obiekty String mają wiele różnych przydatnych metod. Jednym z nich jest toCharArray . Ta metoda konwertuje ciąg znaków na tablicę znaków:
String str = "Hello world";
char[] charArr = str.toCharArray();
Następnie mamy tablicę znaków, do których możemy odwoływać się za pomocą indeksu:
char firstChar = charArr[0]; // H
61. Jak przekonwertować ciąg znaków na tablicę bajtów i odwrotnie? Napisz odpowiedni kod
Klasa String posiada metodę getBytes , która jest podobna do metody toCharArray i zwraca ciąg znaków w postaci tablicy bajtów:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Doszliśmy do logicznego wniosku z naszej dzisiejszej recenzji. Dziękuje za przeczytanie!
GO TO FULL VERSION