Jarné sklady dát

1. Úvod

Pri modelovaní systému alebo procesu v reálnom svete sú dobrou voľbou úložiská v štýle doménového dizajnu (DDD). Z tohto dôvodu môžeme ako Spring Abstraction Layer použiť Spring Data JPA.

Ak ste v tomto koncepte nováčikom, pozrite si tento úvodný tutoriál, ktorý vám pomôže dostať sa do tempa.

V tomto tutoriáli sa zameriame na koncept vytvárania vlastných aj skladateľných úložísk, ktoré sa vytvárajú pomocou menších úložísk nazývaných fragmenty.

2. Maven závislosti

Možnosť vytvárať zložiteľné úložiská je k dispozícii od jari 5.

Pridajme požadovanú závislosť pre Spring Data JPA:

 org.springframework.data spring-data-jpa 2.2.2.RELEASE 

Aby naša vrstva prístupu k údajom fungovala, museli by sme tiež nastaviť zdroj údajov. Pre vývoj a rýchle testovanie je dobré nastaviť databázu v pamäti, ako je H2.

3. Pozadie

3.1. Hibernácia ako implementácia JPA

Spring Data JPA štandardne používa Hibernate ako implementáciu JPA. Môžeme ľahko zameniť jeden s druhým alebo ich porovnať, slúžia však na rôzne účely.

Spring Data JPA je vrstva abstrakcie prístupu k údajom, pod ktorou môžeme použiť ľubovoľnú implementáciu. Mohli by sme napríklad vypnúť režim dlhodobého spánku v prospech EclipseLink.

3.2. Predvolené úložiská

V mnohých prípadoch by sme nemuseli sami písať nijaké dotazy.

Namiesto toho musíme vytvoriť iba rozhrania, ktoré následne rozšíria všeobecné rozhrania Spring Data Repository:

verejné rozhranie LocationRepository rozširuje JpaRepository {}

A to by nám samo o sebe umožnilo vykonávať bežné operácie - CRUD, stránkovanie a triedenie - na serveri Poloha objekt, ktorý má primárny kľúč typu Dlhé.

Aplikácia Spring Data JPA je ďalej vybavená mechanizmom na vytváranie dotazov, ktorý umožňuje generovať dotazy v našom mene pomocou konvencií názvu metódy:

verejné rozhranie StoreRepository rozširuje JpaRepository {List findStoreByLocationId (Long locationId); }

3.3. Vlastné úložiská

Ak je to potrebné, môžeme obohatiť naše modelové úložisko napísaním fragmentového rozhrania a implementáciou požadovanej funkčnosti. To potom môže byť vložené do nášho vlastného úložiska JPA.

Napríklad tu obohacujeme našu ItemTypeRepository rozšírením úložiska fragmentov:

verejné rozhranie ItemTypeRepository rozširuje JpaRepository, CustomItemTypeRepository {}

Tu CustomItemTypeRepository je ďalšie rozhranie:

verejné rozhranie CustomItemTypeRepository {void deleteCustomById (ItemType entity); }

Jeho implementáciou môže byť úložisko každého druhu, nielen JPA:

verejná trieda CustomItemTypeRepositoryImpl implementuje CustomItemTypeRepository {@Autowired private EntityManager entityManager; @Override public void deleteCustomById (ItemType itemType) {entityManager.remove (itemType); }}

Musíme sa len uistiť, že má postfix Impl. Môžeme však nastaviť vlastný postfix pomocou nasledujúcej konfigurácie XML:

alebo pomocou tejto anotácie:

@EnableJpaRepositories (basePackages = "com.baeldung.repository", repositoryImplementationPostfix = "CustomImpl")

4. Skladanie repozitárov pomocou viacerých fragmentov

Až do niekoľkých vydaní sme mohli rozširovať naše rozhrania úložiska iba pomocou jedinej vlastnej implementácie. Toto bolo obmedzenie, kvôli ktorému by sme museli spojiť všetky súvisiace funkcie do jedného objektu.

Netreba dodávať, že pri väčších projektoch so zložitými doménovými modelmi to vedie k nafúknutým triedam.

Teraz s jarou 5 máme možnosť obohatiť naše úložisko JPA o viaceré úložiská fragmentov. Opäť zostáva požiadavkou, aby sme tieto fragmenty mali ako páry implementácie rozhrania.

Aby sme to demonštrovali, vytvorme dva fragmenty:

verejné rozhranie CustomItemTypeRepository {void deleteCustom (entita ItemType); void findThenDelete (Long id); } verejné rozhranie CustomItemRepository {Item findItemById (Long id); void deleteCustom (entita položky); void findThenDelete (Long id); }

Samozrejme, potrebovali by sme napísať ich implementácie. Ale namiesto toho, aby sme tieto vlastné úložiská - so súvisiacimi funkciami - zapojili do svojich vlastných úložísk JPA, môžeme rozšíriť funkcionalitu jedného úložiska JPA:

verejné rozhranie ItemTypeRepository rozširuje JpaRepository, CustomItemTypeRepository, CustomItemRepository {}

Teraz by sme mali všetky prepojené funkcie v jednom úložisku.

5. Zaoberanie sa nejednoznačnosťou

Pretože dedíme z viacerých úložísk, môžeme mať problém zistiť, ktorá z našich implementácií by sa použila v prípade stretu. Napríklad v našom príklade majú obidve úložiská fragmentov metódu, findThenDelete (), s rovnakým podpisom.

V tomto scenári na vyriešenie nejasností sa používa poradie deklarácie rozhraní. Následne v našom prípade metóda vo vnútri CustomItemTypeRepository sa použije, pretože je deklarovaný ako prvý.

Môžeme to otestovať pomocou tohto testovacieho prípadu:

@Test public void givenItemAndItemTypeWhenDeleteThenItemTypeDeleted () {Voliteľné itemType = composRepository.findById (1L); assertTrue (itemType.isPresent ()); Položka item = composerRepository.findItemById (2L); assertNotNull (položka); ComposedRepository.findThenDelete (1L); Voliteľné sameItemType = composRepository.findById (1L); assertFalse (sameItemType.isPresent ()); Položka sameItem = composRepository.findItemById (2L); assertNotNull (sameItem); }

6. Záver

V tomto článku sme sa pozreli na rôzne spôsoby, ako môžeme používať úložiská Spring Data JPA. Videli sme, že jar umožňuje jednoduché vykonávanie databázových operácií na našich doménových objektoch bez nutnosti písania veľkého množstva kódu alebo dokonca dotazov SQL.

Táto podpora je značne prispôsobiteľná použitím skladateľných úložísk.

Útržky kódu z tohto článku sú k dispozícii ako projekt Maven tu na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found