Spremišta za proljeće s podacima

1. Uvod

Pri modeliranju stvarnog sustava ili procesa, spremišta stilova dizajna vođenog domenom dobra su opcija. U tu svrhu možemo koristiti Spring Data JPA kao sloj apstrakcije pristupa podacima.

Ako ste novi u ovom konceptu, pogledajte ovaj uvodni vodič koji će vam pomoći da ubrzate.

U ovom uputstvu usredotočit ćemo se na koncept stvaranja prilagođenih spremišta kao i kompozitnih spremišta koja se stvaraju pomoću manjih spremišta koja se nazivaju fragmenti.

2. Ovisnosti Mavena

Opcija za stvaranje spremišta koja se mogu sastaviti dostupna je počevši od proljeća 5.

Dodajmo potrebnu ovisnost za Spring Data JPA:

 org.springframework.data spring-data-jpa 2.2.2.OSLOBOĐENJE 

Također bismo trebali postaviti izvor podataka kako bi naš sloj pristupa podacima radio. Dobro je postaviti bazu podataka u memoriji poput H2 za razvoj i brzo testiranje.

3. Pozadina

3.1. Hibernate kao provedba JPA-e

Spring Data JPA, prema zadanim postavkama, koristi Hibernate kao JPA implementaciju. Jednostavno možemo zamijeniti jedno s drugim ili ih usporediti, ali oni imaju različite svrhe.

Spring Data JPA sloj je apstrakcije pristupa podacima ispod kojeg možemo koristiti bilo koju implementaciju. Na primjer, mogli bismo isključiti hibernaciju u korist EclipseLinka.

3.2. Zadana spremišta

U puno slučajeva ne bismo trebali sami pisati upite.

Umjesto toga, trebamo stvoriti samo sučelja koja zauzvrat proširuju generička sučelja spremišta podataka Spring:

javno sučelje LocationRepository proširuje JpaRepository {}

A to bi samo po sebi omogućilo zajedničke operacije - CRUD, paging i sortiranje - na Mjesto objekt koji ima primarni ključ tipa Dugo.

Nadalje, Spring Data JPA dolazi opremljen mehanizmom za izradu upita koji pruža mogućnost generiranja upita u naše ime pomoću konvencija o nazivima metoda:

javno sučelje StoreRepository proširuje JpaRepository {List findStoreByLocationId (Long locationId); }

3.3. Prilagođena spremišta

Ako je potrebno, možemo obogatite naše spremište modela pisanjem sučelja fragmenata i implementacijom željene funkcionalnosti. To se zatim može ubrizgati u naše vlastito spremište JPA.

Na primjer, ovdje obogaćujemo svoje ItemTypeRepository proširivanjem spremišta fragmenata:

javno sučelje ItemTypeRepository proširuje JpaRepository, CustomItemTypeRepository {}

Ovdje Spremište CustomItemTypeRepository je još jedno sučelje:

javno sučelje CustomItemTypeRepository {void deleteCustomById (ItemType entitet); }

Njegova implementacija može biti spremište bilo koje vrste, ne samo JPA:

javna klasa CustomItemTypeRepositoryImpl implementira CustomItemTypeRepository {@Autowired private EntityManager entityManager; @Override public void deleteCustomById (ItemType itemType) {entityManager.remove (itemType); }}

Samo se moramo pobrinuti da sadrži postfix Impl. Međutim, možemo postaviti prilagođeni postfix pomoću sljedeće XML konfiguracije:

ili pomoću ove bilješke:

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

4. Sastavljanje spremišta pomoću višestrukih fragmenata

Do prije nekoliko izdanja, sučelja spremišta mogli smo proširiti samo jednom prilagođenom implementacijom. To je bilo ograničenje zbog kojeg bismo morali povezati sve povezane funkcije u jedan objekt.

Nepotrebno je reći da za veće projekte sa složenim modelima domene to dovodi do napuhanih klasa.

Sada s Spring 5 imamo mogućnost obogatite naše JPA spremište s više spremišta fragmenata. Opet, ostaje zahtjev da imamo te fragmente kao parove sučelja i implementacije.

Da bismo to demonstrirali, stvorimo dva fragmenta:

javno sučelje CustomItemTypeRepository {void deleteCustom (ItemType entitet); void findThenDelete (dugi id); } javno sučelje CustomItemRepository {Stavka findItemById (dugi id); void deleteCustom (entitet predmeta); void findThenDelete (dugi id); }

Naravno, trebali bismo napisati njihove implementacije. Ali umjesto da ove prilagođene spremišta - sa srodnim funkcionalnostima - priključimo u njihova vlastita JPA spremišta, možemo proširiti funkcionalnost jednog JPA spremišta:

javno sučelje ItemTypeRepository proširuje JpaRepository, CustomItemTypeRepository, CustomItemRepository {}

Sad bismo imali sve povezane funkcije u jednom jedinstvenom spremištu.

5. Suočavanje s dvosmislenošću

Budući da nasljeđujemo iz više spremišta, mogli bismo imati problema s odgonetavanjem koje bi se od naših implementacija koristilo u slučaju sukoba. Na primjer, u našem primjeru, oba spremišta fragmenata imaju metodu, findThenDelete (), s istim potpisom.

U ovom scenariju, redoslijed deklaracije sučelja koristi se za rješavanje nejasnoća. Slijedom toga, u našem slučaju, metoda iznutra Spremište CustomItemTypeRepository koristit će se od prvog proglašenja.

To možemo testirati pomoću ovog test slučaja:

@Test javna praznina givenItemAndItemTypeWhenDeleteThenItemTypeDeleted () {Neobvezno itemType = sastavljenoRepozitorij.findById (1L); assertTrue (itemType.isPresent ()); Stavka stavka = sastavljenRepozitorij.findItemById (2L); assertNotNull (stavka); compiRepository.findThenDelete (1L); Neobvezno sameItemType = sastavljenRepozitorij.findById (1L); assertFalse (sameItemType.isPresent ()); Stavka sameItem = sastavljenoRepozitorij.findItemById (2L); assertNotNull (sameItem); }

6. Zaključak

U ovom smo članku pogledali različite načine na koje možemo koristiti spremišta Spring Data JPA. Vidjeli smo da Spring olakšava izvođenje operacija baze podataka na objektima naše domene bez pisanja puno koda ili čak SQL upita.

Ova podrška je znatno prilagodljiva upotrebom spremišta koja se mogu sastaviti.

Isječci koda iz ovog članka dostupni su kao Maven projekt ovdje na GitHubu.


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