JAVA PERSISTENCE PROGRAMOWANIE APLIKACJI BAZODANOWYCH

89.10

Na stanie

SPIS TREŚCI

Słowo wstępne do pierwszego wydania (17)

Przedmowa (19)

Podziękowania (21)

O książce (23)

O autorach (27)

CZĘŚĆ I. WPROWADZENIE W TEMATYKĘ ORM (29)

Rozdział 1. Utrwalanie obiektowo-relacyjne (31)

  • 1.1. Co to jest utrwalanie? (32)
    • 1.1.1. Relacyjne bazy danych (33)
    • 1.1.2. Język SQL (34)
    • 1.1.3. Korzystanie z języka SQL w Javie (35)
  • 1.2. Niedopasowanie paradygmatów (37)
    • 1.2.1. Problem ziarnistości (38)
    • 1.2.2. Problem podtypów (40)
    • 1.2.3. Problem tożsamości (41)
    • 1.2.4. Problemy związane z asocjacjami (43)
    • 1.2.5. Problem poruszania się po danych (44)
  • 1.3. ORM i JPA (45)
  • 1.4. Podsumowanie (47)

Rozdział 2. Zaczynamy projekt (49)

  • 2.1. Wprowadzenie do frameworka Hibernate (49)
  • 2.2. Aplikacja „Witaj, świecie” z JPA (50)
    • 2.2.1. Konfigurowanie jednostki utrwalania (51)
    • 2.2.2. Pisanie klasy utrwalania (53)
    • 2.2.3. Zapisywanie i ładowanie komunikatów (54)
  • 2.3. Natywne mechanizmy konfiguracji frameworka Hibernate (57)
  • 2.4. Podsumowanie (60)

Rozdział 3. Modele dziedziny i metadane (61)

  • 3.1. Przykładowa aplikacja CaveatEmptor (62)
    • 3.1.1. Architektura warstwowa (62)
    • 3.1.2. Analiza dziedziny biznesowej (64)
    • 3.1.3. Model dziedziny aplikacji CaveatEmptor (65)
  • 3.2. Implementacja modelu dziedziny (66)
    • 3.2.1. Rozwiązanie problemu wyciekania obszarów zainteresowania (67)
    • 3.2.2. Przezroczyste i zautomatyzowane utrwalanie (68)
    • 3.2.3. Pisanie klas zdolnych do utrwalania (69)
    • 3.2.4. Implementacja asocjacji POJO (73)
  • 3.3. Metadane modelu dziedziny (77)
    • 3.3.1. Metadane bazujące na adnotacjach (78)
    • 3.3.2. Stosowanie reguł Bean Validation (80)
    • 3.3.3. Pobieranie metadanych z zewnętrznych plików XML (83)
    • 3.3.4. Dostęp do metadanych w fazie działania aplikacji (87)
  • 3.4. Podsumowanie (90)

CZĘŚĆ II. STRATEGIE MAPOWANIA (91)

Rozdział 4. Mapowanie klas utrwalania (93)

  • 4.1. Encje i typy wartości (93)
    • 4.1.1. Drobnoziarniste modele dziedziny (94)
    • 4.1.2. Definiowanie pojęć aplikacji (94)
    • 4.1.3. Odróżnianie encji od typów wartości (96)
  • 4.2. Mapowanie encji z tożsamością (97)
    • 4.2.1. Tożsamość a równość w Javie (98)
    • 4.2.2. Pierwsza klasa encji i mapowanie (98)
    • 4.2.3. Wybieranie klucza głównego (100)
    • 4.2.4. Konfigurowanie generatorów kluczy (101)
    • 4.2.5. Strategie generatorów identyfikatorów (104)
  • 4.3. Opcje mapowania encji (108)
    • 4.3.1. Zarządzanie nazwami (108)
    • 4.3.2. Dynamiczne generowanie SQL (111)
    • 4.3.3. Encje niezmienne (112)
    • 4.3.4. Mapowanie encji na podzapytanie (113)
  • 4.4. Podsumowanie (114)

Rozdział 5. Mapowanie typów wartości (117)

  • 5.1. Mapowanie prostych właściwości (118)
    • 5.1.1. Przesłanianie domyślnego zachowania dla właściwości o typach prostych (119)
    • 5.1.2. Personalizacja dostępu do właściwości (120)
    • 5.1.3. Używanie właściwości wyprowadzonych (122)
    • 5.1.4. Transformacje wartości kolumn (123)
    • 5.1.5. Wygenerowane i domyślne wartości właściwości (124)
    • 5.1.6. Właściwości opisujące czas (125)
    • 5.1.7. Mapowanie typów wyliczeniowych (126)
  • 5.2. Mapowanie komponentów osadzanych (126)
    • 5.2.1. Schemat bazy danych (127)
    • 5.2.2. Przystosowanie klas do osadzania (127)
    • 5.2.3. Przesłanianie osadzonych atrybutów (131)
    • 5.2.4. Mapowanie zagnieżdżonych komponentów osadzanych (132)
  • 5.3. Mapowanie typów Java i SQL za pomocą konwerterów (134)
    • 5.3.1. Typy wbudowane (134)
    • 5.3.2. Tworzenie własnych konwerterów JPA (140)
    • 5.3.3. Rozszerzanie frameworka Hibernate za pomocą typów użytkownika (147)
  • 5.4. Podsumowanie (154)

Rozdział 6. Mapowanie dla dziedziczenia (155)

  • 6.1. Jedna tabela na konkretną klasę. Niejawna obsługa polimorfizmu (156)
  • 6.2. Jedna tabela na konkretną klasę oraz unie (158)
  • 6.3. Jedna tabela na hierarchię klas (160)
  • 6.4. Jedna tabela na podklasę oraz złączenia (164)
  • 6.5. Mieszane strategie dziedziczenia (167)
  • 6.6. Dziedziczenie klas osadzanych (169)
  • 6.7. Wybór strategii (172)
  • 6.8. Asocjacje polimorficzne (173)
    • 6.8.1. Polimorficzne asocjacje wiele-do-jednego (173)
    • 6.8.2. Polimorficzne kolekcje (176)
  • 6.9. Podsumowanie (177)

Rozdział 7. Mapowanie kolekcji i asocjacje pomiędzy encjami (179)

  • 7.1. Zbiory, kolekcje bag, listy i mapy typów wartości (180)
    • 7.1.1. Schemat bazy danych (180)
    • 7.1.2. Tworzenie i mapowanie właściwości będących kolekcjami (180)
    • 7.1.3. Wybór interfejsu kolekcji (182)
    • 7.1.4. Mapowanie zbioru (184)
    • 7.1.5. Mapowanie kolekcji bag identyfikatorów (185)
    • 7.1.6. Mapowanie list (186)
    • 7.1.7. Mapowanie mapy (187)
    • 7.1.8. Kolekcje posortowane i uporządkowane (188)
  • 7.2. Kolekcje komponentów (191)
    • 7.2.1. Równość egzemplarzy komponentu (192)
    • 7.2.2. Kolekcja Set komponentów (194)
    • 7.2.3. Kolekcja bag komponentów (196)
    • 7.2.4. Mapa wartości komponentów (197)
    • 7.2.5. Komponenty jako klucze mapy (198)
    • 7.2.6. Kolekcje w komponencie osadzanym (199)
  • 7.3. Mapowanie asocjacji encji (200)
    • 7.3.1. Najprostsza możliwa asocjacja (201)
    • 7.3.2. Definiowanie asocjacji dwukierunkowych (202)
    • 7.3.3. Kaskadowe zmiany stanu (204)
  • 7.4. Podsumowanie (211)

Rozdział 8. Zaawansowane mapowanie asocjacji pomiędzy encjami (213)

  • 8.1. Asocjacje jeden-do-jednego (214)
    • 8.1.1. Współdzielenie klucza głównego (214)
    • 8.1.2. Generator kluczy obcych i głównych (217)
    • 8.1.3. Wykorzystanie kolumny złączenia klucza obcego (220)
    • 8.1.4. Korzystanie z tabeli złączenia (221)
  • 8.2. Asocjacje jeden-do-wielu (224)
    • 8.2.1. Kolekcje bag jeden-do-wielu (224)
    • 8.2.2. Jednokierunkowe i dwukierunkowe mapowania list (226)
    • 8.2.3. Opcjonalna asocjacja jeden-do-wielu z tabelą złączenia (228)
    • 8.2.4. Asocjacje jeden-do-wielu w klasach osadzanych (230)
  • 8.3. Asocjacje wiele-do-wielu i asocjacje potrójne (232)
    • 8.3.1. Jednokierunkowe i dwukierunkowe asocjacje wiele-do-wielu (232)
    • 8.3.2. Asocjacja wiele-do-wielu z pośrednią encją (234)
    • 8.3.3. Asocjacje trójelementowe z komponentami (238)
  • 8.4. Asocjacje pomiędzy encjami z wykorzystaniem kolekcji Map (241)
    • 8.4.1. Relacje jeden-do-wielu z kluczem w postaci właściwości (241)
    • 8.4.2. Relacje trójczłonowe klucz-wartość (243)
  • 8.5. Podsumowanie (244)

Rozdział 9. Schematy złożone i odziedziczone (245)

  • 9.1. Ulepszanie schematu bazy danych (246)
    • 9.1.1. Dodawanie pomocniczych obiektów bazy danych (247)
    • 9.1.2. Ograniczenia SQL (250)
    • 9.1.3. Tworzenie indeksów (257)
  • 9.2. Obsługa kluczy odziedziczonych (258)
    • 9.2.1. Mapowanie naturalnych kluczy głównych (258)
    • 9.2.2. Mapowanie złożonych kluczy głównych (259)
    • 9.2.3. Klucze obce w złożonych kluczach głównych (261)
    • 9.2.4. Klucze obce w złożonych kluczach głównych (264)
    • 9.2.5. Klucze obce odwołujące się do pól niebędących kluczami głównymi (265)
  • 9.3. Mapowanie właściwości do tabel pomocniczych (266)
  • 9.4. Podsumowanie (268)

CZĘŚĆ III. TRANSAKCYJNE PRZETWARZANIE DANYCH (269)

Rozdział 10. Zarządzanie danymi (271)

  • 10.1. Cykl życia utrwalania (272)
    • 10.1.1. Stany egzemplarza encji (273)
    • 10.1.2. Kontekst utrwalania (274)
  • 10.2. Interfejs EntityManager (276)
    • 10.2.1. Kanoniczna jednostka pracy (276)
    • 10.2.2. Utrwalanie danych (278)
    • 10.2.3. Pobieranie i modyfikowanie trwałych danych (279)
    • 10.2.4. Pobieranie referencji (281)
    • 10.2.5. Przełączanie danych do stanu przejściowego (282)
    • 10.2.6. Odświeżanie danych (284)
    • 10.2.7. Replikowanie danych (284)
    • 10.2.8. Buforowanie w kontekście utrwalania (285)
    • 10.2.9. Synchronizowanie kontekstu utrwalania (287)
  • 10.3. Praca z encjami w stanie odłączonym (288)
    • 10.3.1. Tożsamość odłączonych egzemplarzy (289)
    • 10.3.2. Implementacja metody równości (291)
    • 10.3.3. Odłączanie egzemplarzy encji (294)
    • 10.3.4. Scalanie egzemplarzy encji (295)
  • 10.4. Podsumowanie (297)

Rozdział 11. Transakcje i współbieżność (299)

  • 11.1. Podstawowe wiadomości o transakcjach (300)
    • 11.1.1. Cechy ACID (300)
    • 11.1.2. Transakcje bazodanowe i systemowe (301)
    • 11.1.3. Transakcje programowe z JTA (301)
    • 11.1.4. Obsługa wyjątków (303)
    • 11.1.5. Deklaratywne rozgraniczanie transakcji (306)
  • 11.2. Zarządzanie współbieżnym dostępem (306)
    • 11.2.1. Współbieżność na poziomie bazy danych (307)
    • 11.2.2. Optymistyczne zarządzanie współbieżnością (312)
    • 11.2.3. Jawne pesymistyczne blokady (320)
    • 11.2.4. Unikanie zakleszczeń (324)
  • 11.3. Dostęp do danych na zewnątrz transakcji (325)
    • 11.3.1. Czytanie danych w trybie autozatwierdzania (326)
    • 11.3.2. Kolejkowanie modyfikacji (328)
  • 11.4. Podsumowanie (329)

Rozdział 12. Plany pobierania, strategie i profile (331)

  • 12.1. Ładowanie leniwe i zachłanne (332)
    • 12.1.1. Obiekty proxy encji (333)
    • 12.1.2. Leniwe ładowanie trwałych kolekcji (337)
    • 12.1.3. Leniwe ładowanie z przechwytywaniem (339)
    • 12.1.4. Zachłanne ładowanie asocjacji i kolekcji (342)
  • 12.2. Wybór strategii pobierania (344)
    • 12.2.1. Problem n+1 instrukcji SELECT (345)
    • 12.2.2. Problem iloczynu kartezjańskiego (346)
    • 12.2.3. Pobieranie danych partiami z wyprzedzeniem (349)
    • 12.2.4. Pobieranie kolekcji z wyprzedzeniem z wykorzystaniem podzapytań (351)
    • 12.2.5. Pobieranie zachłanne z wieloma instrukcjami SELECT (352)
    • 12.2.6. Dynamiczne pobieranie zachłanne (353)
  • 12.3. Korzystanie z profili pobierania (355)
    • 12.3.1. Deklarowanie profili pobierania Hibernate (356)
    • 12.3.2. Korzystanie z grafów encji (357)
  • 12.4. Podsumowanie (361)

Rozdział 13. Filtrowanie danych (363)

  • 13.1. Kaskadowe przejścia stanu (364)
    • 13.1.1. Dostępne opcje kaskadowe (365)
    • 13.1.2. Przechodnie odłączanie i scalanie (366)
    • 13.1.3. Kaskadowe odświeżanie (368)
    • 13.1.4. Kaskadowe replikacje (370)
    • 13.1.5. Włączanie globalnej opcji przechodniego utrwalania (371)
  • 13.2. Nasłuchiwanie i przechwytywanie zdarzeń (372)
    • 13.2.1. Obserwatory zdarzeń i wywołania zwrotne JPA (372)
    • 13.2.2. Implementacja interceptorów Hibernate (376)
    • 13.2.3. Rdzeń systemu obsługi zdarzeń (380)
  • 13.3. Audyt i wersjonowanie z wykorzystaniem Hibernate Envers (382)
    • 13.3.1. Aktywacja rejestrowania audytu (382)
    • 13.3.2. Tworzenie śladu audytu (384)
    • 13.3.3. Szukanie wersji (385)
    • 13.3.4. Dostęp do historycznych danych (386)
  • 13.4. Dynamiczne filtry danych (389)
    • 13.4.1. Definiowanie dynamicznych filtrów (390)
    • 13.4.2. Stosowanie filtra (390)
    • 13.4.3. Włączanie filtra (391)
    • 13.4.4. Filtrowanie dostępu do kolekcji (392)
  • 13.5. Podsumowanie (393)

CZĘŚĆ IV. PISANIE ZAPYTAŃ (395)

Rozdział 14. Tworzenie i uruchamianie zapytań (397)

  • 14.1. Tworzenie zapytań (398)
    • 14.1.1. Interfejsy zapytań JPA (398)
    • 14.1.2. Wyniki zapytania z określonym typem danych (401)
    • 14.1.3. Interfejsy zapytań frameworka Hibernate (402)
  • 14.2. Przygotowywanie zapytań (403)
    • 14.2.1. Zabezpieczenie przed atakami wstrzykiwania SQL (403)
    • 14.2.2. Wiązanie parametrów nazwanych (404)
    • 14.2.3. Korzystanie z parametrów pozycyjnych (406)
    • 14.2.4. Stronicowanie dużych zbiorów wyników (406)
  • 14.3. Uruchamianie zapytań (408)
    • 14.3.1. Wyszczególnianie wszystkich wyników (408)
    • 14.3.2. Pobieranie pojedynczego wyniku (408)
    • 14.3.3. Przewijanie z wykorzystaniem kursorów bazy danych (409)
    • 14.3.4. Iterowanie po wynikach (411)
  • 14.4. Nazywanie i eksternalizacja zapytań (412)
    • 14.4.1. Wywoływanie zapytania przez nazwę (412)
    • 14.4.2. Definiowanie zapytań w metadanych XML (413)
    • 14.4.3. Definiowanie zapytań z adnotacjami (414)
    • 14.4.4. Programowe definiowanie nazwanych zapytań (415)
  • 14.5. Podpowiedzi do zapytań (416)
    • 14.5.1. Ustawianie limitu czasu (417)
    • 14.5.2. Ustawianie trybu synchronizacji (417)
    • 14.5.3. Ustawianie trybu tylko do odczytu (418)
    • 14.5.4. Ustawianie rozmiaru pobierania (418)
    • 14.5.5. Ustawianie komentarza SQL (419)
    • 14.5.6. Podpowiedzi nazwanych zapytań (419)
  • 14.6. Podsumowanie (421)

Rozdział 15. Języki zapytań (423)

  • 15.1. Selekcja (424)
    • 15.1.1. Przypisywanie aliasów i rdzeni zapytań (425)
    • 15.1.2. Zapytania polimorficzne (426)
  • 15.2. Ograniczenia (427)
    • 15.2.1. Wyrażenia porównań (428)
    • 15.2.2. Wyrażenia z kolekcjami (432)
    • 15.2.3. Wywoływanie funkcji (433)
    • 15.2.4. Sortowanie wyników zapytania (436)
  • 15.3. Rzutowanie (437)
    • 15.3.1. Rzutowanie encji i wartości skalarnych (437)
    • 15.3.2. Dynamiczne tworzenie egzemplarzy (439)
    • 15.3.3. Niepowtarzalność wyników (440)
    • 15.3.4. Wywoływanie funkcji w projekcjach (441)
    • 15.3.5. Funkcje agregacji (443)
    • 15.3.6. Grupowanie (445)
  • 15.4. Złączenia (446)
    • 15.4.1. Złączenia w SQL (447)
    • 15.4.2. Opcje złączenia w JPA (449)
    • 15.4.3. Niejawne złączenia asocjacyjne (449)
    • 15.4.4. Złączenia jawne (451)
    • 15.4.5. Dynamiczne pobieranie ze złączeniami (453)
    • 15.4.6. Złączenia teta (456)
    • 15.4.7. Porównywanie identyfikatorów (457)
  • 15.5. Podzapytania (459)
    • 15.5.1. Zagnieżdżanie skorelowane i nieskorelowane (460)
    • 15.5.2. Kwantyfikacja (461)
  • 15.6. Podsumowanie (462)

Rozdział 16. Zaawansowane opcje zapytań (465)

  • 16.1. Transformacje wyników zapytań (466)
    • 16.1.1. Zwracanie listy list (466)
    • 16.1.2. Zwracanie listy map (467)
    • 16.1.3. Mapowanie aliasów na właściwości JavaBean (468)
    • 16.1.4. Pisanie własnej implementacji klasy ResultTransformer (469)
  • 16.2. Filtrowanie kolekcji (470)
  • 16.3. API Criteria frameworka Hibernate (473)
    • 16.3.1. Selekcja i porządkowanie (473)
    • 16.3.2. Ograniczanie (474)
    • 16.3.3. Rzutowanie i agregacja (475)
    • 16.3.4. Złączenia (477)
    • 16.3.5. Podzapytania (478)
    • 16.3.6. Zapytania przez przykład (479)
  • 16.4. Podsumowanie (482)

Rozdział 17. Dostosowywanie SQL (483)

  • 17.1. Korzystanie z trybu JDBC (484)
  • 17.2. Mapowanie wyników zapytania SQL (486)
    • 17.2.1. Rzutowanie z zapytaniami SQL (487)
    • 17.2.2. Mapowanie na klasy encji (488)
    • 17.2.3. Dostosowywanie mapowania wyników (490)
    • 17.2.4. Eksternalizacja natywnych zapytań (502)
  • 17.3. Dostosowywanie operacji CRUD (505)
    • 17.3.1. Własne mechanizmy ładujące (505)
    • 17.3.2. Personalizacja operacji tworzenia, aktualizowania i usuwania egzemplarzy encji (507)
    • 17.3.3. Personalizacja operacji na kolekcjach (509)
    • 17.3.4. Zachłanne pobieranie we własnych mechanizmach ładujących (511)
  • 17.4. Wywoływanie procedur składowanych (513)
    • 17.4.1. Zwracanie zbioru wyników (515)
    • 17.4.2. Zwracanie wielu zbiorów wyników oraz liczników aktualizacji (516)
    • 17.4.3. Ustawianie parametrów wejściowych i wyjściowych (518)
    • 17.4.4. Zwracanie kursora (521)
  • 17.5. Wykorzystywanie procedur składowanych do operacji CRUD (522)
    • 17.5.1. Spersonalizowany mechanizm ładujący z procedurą (523)
    • 17.5.2. Procedury dla operacji CUD (524)
  • 17.6. Podsumowanie (526)

CZĘŚĆ V. BUDOWANIE APLIKACJI (527)

Rozdział 18. Projektowanie aplikacji klient-serwer (529)

  • 18.1. Tworzenie warstwy utrwalania (530)
    • 18.1.1. Generyczny wzorzec obiektu dostępu do danych (532)
    • 18.1.2. Implementacja generycznego interfejsu (533)
    • 18.1.3. Implementacja obiektów DAO encji (536)
    • 18.1.4. Testowanie warstwy utrwalania (538)
  • 18.2. Budowa serwera bezstanowego (540)
    • 18.2.1. Edycja przedmiotu aukcji (540)
    • 18.2.2. Składanie oferty (543)
    • 18.2.3. Analiza aplikacji bezstanowej (546)
  • 18.3. Budowanie serwera stateful (548)
    • 18.3.1. Edycja przedmiotu aukcji (549)
    • 18.3.2. Analiza aplikacji stateful (554)
  • 18.4. Podsumowanie (556)

Rozdział 19. Budowanie aplikacji webowych (557)

  • 19.1. Integracja JPA z CDI (558)
    • 19.1.1. Tworzenie obiektu EntityManager (558)
    • 19.1.2. Łączenie obiektu EntityManager z transakcjami (560)
    • 19.1.3. Wstrzykiwanie obiektu EntityManager (560)
  • 19.2. Stronicowanie i sortowanie danych (562)
    • 19.2.1. Stronicowanie na bazie przesunięć a stronicowanie przez przeszukiwanie (563)
    • 19.2.2. Stronicowanie w warstwie utrwalania (565)
    • 19.2.3. Odpytywanie strona po stronie (571)
  • 19.3. Budowanie aplikacji JSF (572)
    • 19.3.1. Usługi o zasięgu żądania (572)
    • 19.3.2. Usługi o zasięgu konwersacji (576)
  • 19.4. Serializacja danych modelu dziedziny (585)
    • 19.4.1. Pisanie usługi JAX-RS (585)
    • 19.4.2. Stosowanie mapowań JAXB (587)
    • 19.4.3. Serializacja obiektów proxy frameworka Hibernate (589)
  • 19.5. Podsumowanie (593)

Rozdział 20. Skalowanie Hibernate (595)

  • 20.1. Przetwarzanie masowe i wsadowe (596)
    • 20.1.1. Instrukcje masowe w JPQL i API kryteriów (596)
    • 20.1.2. Masowe instrukcje w SQL (601)
    • 20.1.3. Przetwarzanie wsadowe (602)
    • 20.1.4. Interfejs StatelessSession frameworka Hibernate (606)
  • 20.2. Buforowanie danych (608)
    • 20.2.1. Architektura współdzielonej pamięci podręcznej frameworka Hibernate (609)
    • 20.2.2. Konfigurowanie współdzielonej pamięci podręcznej (614)
    • 20.2.3. Buforowanie encji i kolekcji (616)
    • 20.2.4. Testowanie współdzielonej pamięci podręcznej (619)
    • 20.2.5. Ustawianie trybów pamięci podręcznej (622)
    • 20.2.6. Zarządzanie współdzieloną pamięcią podręczną (623)
    • 20.2.7. Pamięć podręczna wyników zapytania (624)
  • 20.3. Podsumowanie (627)

Bibliografia (629)

Skorowidz (631)

Autor

ISBN

978-83-283-2782-5

Liczba stron

Rok wydania

Wydawca

Opinie

Na razie nie ma opinii o produkcie.

Napisz pierwszą opinię o „JAVA PERSISTENCE PROGRAMOWANIE APLIKACJI BAZODANOWYCH”

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *