Sprievodca dátovým modulom DeltaSpike

1. Prehľad

Apache DeltaSpike je projekt, ktorý poskytuje a zbierka prípon CDI pre projekty Java; vyžaduje to, aby bola implementácia CDI dostupná za behu.

Môže samozrejme pracovať s rôznou implementáciou CDI - JBoss Weld alebo OpenWebBeans. Testuje sa tiež na mnohých aplikačných serveroch.

V tejto príručke sa zameriame na jeden z najznámejších a najužitočnejších - dátový modul.

2. Nastavenie dátového modulu DeltaSpike

Dátový modul Apache DeltaSpike je zvyknutý zjednodušiť implementáciu vzoru úložiska. Dovoľuje zníženie štandardného kódu poskytnutím centralizovanej logiky pre vytváranie a vykonávanie dotazov.

Je to veľmi podobné projektu Spring Data. Na dotazovanie do databázy potrebujeme definovať deklaráciu metódy (bez implementácie), ktorá sa riadi definovanou konvenciou pomenovania alebo ktorá obsahuje @Dopyt anotácia. Implementáciu za nás urobí rozšírenie CDI.

V ďalších podkapitolách sa budeme venovať tomu, ako nastaviť dátový modul Apache DeltaSpike v našej aplikácii.

2.1. Požadované závislosti

Aby sme mohli v aplikácii používať dátový modul Apache DeltaSpike, musíme si nastaviť požadované závislosti.

Keď je Maven naším nástrojom na zostavenie, musíme použiť:

 org.apache.deltaspike.modules deltaspike-data-module-api 1.8.2 kompilovať org.apache.deltaspike.modules deltaspike-data-module-impl 1.8.2 runtime 

Keď používame Gradle:

runtime 'org.apache.deltaspike.modules: deltaspike-data-module-impl' kompilovať 'org.apache.deltaspike.modules: deltaspike-data-modul-api' 

Artefakty dátových modulov Apache DeltaSpike sú k dispozícii na serveri Maven Central:

  • deltaspike-data-module-impl
  • deltaspike-data-module-api

To na spustenie aplikácie s dátovým modulom potrebujeme tiež implementácie JPA a CDI dostupné za behu.

Aj keď je možné spustiť Apache DeltaSpike v aplikácii Java SE, vo väčšine prípadov sa bude nasadiť na aplikačnom serveri (napr. Wildfly alebo WebSphere).

Aplikačné servery majú plnú podporu Jakarta EE, takže nemusíme robiť nič viac. V prípade aplikácie Java SE musíme poskytnúť tieto implementácie (napr. Pridaním závislostí do Hibernate a JBoss Weld).

Ďalej sa budeme venovať aj požadovanej konfigurácii pre EntityManager.

2.2. Konfigurácia správcu entít

The Vyžaduje sa dátový modul EntityManager injekciou cez CDI.

Toho môžeme dosiahnuť použitím výrobcu CDI:

verejná trieda EntityManagerProducer {@PersistenceContext (unitName = "primárny") súkromný EntityManager entityManager; @ApplicationScoped @Produces public EntityManager getEntityManager () {návrat entityManager; }}

Vyššie uvedený kód predpokladá, že máme jednotku perzistencie s menom primárny definované v persistence.xml spis.

Pozrime sa ďalej na príklad definície:

 java: jboss / datasources / baeldung-jee7-seedDS 

Jednotka perzistencie v našom príklade používa typ transakcie JTA, čo znamená, že musíme poskytnúť transakčnú stratégiu, ktorú použijeme.

2.3. Transakčná stratégia

V prípade, že pre náš zdroj údajov používame typ transakcie JTA, musíme definovať stratégiu transakcií, ktorá sa použije v úložiskách Apache DeltaSpike.. Môžeme to urobiť vo vnútri apache-deltaspike.properties spis (pod META-INF adresár):

globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy = org.apache.deltaspike.jpa.impl.transaction.ContainerManagedTransactionStrategy

Existujú štyri typy transakčných stratégií, ktoré môžeme definovať:

  • BeanManagedUserTransactionStrategy
  • ResourceLocalTransactionStrategy
  • ContainerManagedTransactionStrategy
  • EnvironmentAwareTransactionStrategy

Všetci implementujú org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy.

Toto bola posledná časť konfigurácie požadovanej pre náš dátový modul.

Ďalej si ukážeme, ako implementovať triedy vzorov úložiska.

3. Triedy archívov

Keď používame dátový modul Apache DeltaSpike archívom sa môže stať akákoľvek abstraktná trieda alebo rozhranie trieda.

Všetko, čo musíme urobiť, jepridať @Úložiskoanotácia s forEntity atribút, ktorý definuje entitu JPA, ktorú by malo naše úložisko spracovať:

@Entity verejná trieda Používateľ {// ...} @Repository (forEntity = User.class) verejné rozhranie SimpleUserRepository {// ...}

alebo s abstraktnou triedou:

@Repository (forEntity = User.class) verejná abstraktná trieda SimpleUserRepository {// ...} 

Dátový modul objaví triedy (alebo rozhrania) s takouto anotáciou a spracuje metódy, ktoré sú vo vnútri.

Existuje niekoľko možností, ako definovať dopyt, ktorý sa má vykonať. V nasledujúcich častiach sa budeme venovať jednej po druhej.

4. Dotaz od názvu metódy

Prvá možnosť Definovanie dotazu znamená použitie názvu metódy, ktorá sa riadi definovanou konvenciou pomenovania.

Vyzerá to takto:

(Entita | Voliteľné | Zoznam | Stream) (predpona) (Vlastnosť [Komparátor]) {Vlastnosť operátora [Komparátor]} 

Ďalej sa zameriame na každú časť tejto definície.

4.1. Typ vrátenia

The návratový typ definuje hlavne to, koľko objektov môže náš dotaz vrátiť. Nemôžeme definovať jeden typ entity ako návratovú hodnotu v prípade, že by náš dopyt mohol vrátiť viac ako jeden výsledok.

Nasledujúca metóda spôsobí výnimku v prípade, že existuje viac ako jedna Používateľ s menom:

verejný abstrakt Užívateľ findByFirstName (reťazec meno);

Opak nie je pravdou - návratovú hodnotu môžeme definovať ako a Zbierka aj keď výsledkom bude iba jeden celok.

verejná abstraktná zbierka findAnyByFirstName (reťazec firstName);

Predpona názvu metódy, ktorá navrhuje jednu hodnotu ako návratový typ (napr. findAny) je potlačené v prípade, že definujeme návratovú hodnotu ako Zbierka.

Vyššie uvedený dopyt vráti všetky Používatelia s krstným menom zodpovedajúcim dokonca prefix názvu metódy naznačuje niečo iné.

Takéto kombinácie (Zbierka je potrebné sa vyhnúť, pretože kód nie je intuitívny a ťažko pochopiteľný.

V nasledujúcej časti sú uvedené ďalšie podrobnosti o predpone názvu metódy.

4.2. Predpona pre metódu dotazu

Predpona definuje akciu, ktorú chceme vykonať v úložisku. Najužitočnejšie je nájsť entity, ktoré zodpovedajú daným kritériám vyhľadávania.

Pre túto akciu existuje veľa predpôn, napríklad nájsťBy, findAny, findAll. Podrobný zoznam nájdete v oficiálnej dokumentácii Apache DeltaSpike:

verejný abstrakt Užívateľ findAnyByLastName (reťazec priezvisko);

Existujú však aj také ďalšie šablóny metód, ktoré sa používajú na počítanie a odstraňovanie entít. Môžeme počítať všetky riadky v tabuľke:

public abstract int count ();

Tiež odstrániť existuje šablóna metódy, ktorú môžeme pridať do nášho úložiska:

public abstract void remove (užívateľ užívateľa);

Podpora pre countBy a removeBy prefixy metód budú pridané v ďalšej verzii Apache DeltaSpike 1.9.0.

Ďalšia časť ukazuje, ako môžeme do dotazov pridať ďalšie atribúty.

4.3. Dopyt s mnohými vlastnosťami

V dotaze môžeme použiť veľa nehnuteľností kombinovaných s a operátorov.

verejná abstraktná zbierka findByFirstNameAndLastName (reťazec krstné meno, reťazec priezvisko); verejná abstraktná zbierka findByFirstNameOrLastName (reťazec krstné meno, reťazec priezvisko); 

Môžeme kombinovať toľko vlastností, koľko chceme. K dispozícii je tiež vyhľadávanie vnorených vlastností, ktoré si ukážeme ďalej.

4.4. Dopyt s vnorenými vlastnosťami

The dopyt môže tiež používať vnorené vlastnosti.

V nasledujúcom príklade Používateľ entita má vlastnosť adresy typu Adresa a Adresa subjekt má a mesto nehnuteľnosť:

@Entity verejná trieda Adresa {súkromné ​​mesto reťazca; // ...} @Entity public class User {@OneToOne private Address address; // ...} public abstract Collection findByAddress_city (Mesto reťazca);

4.5. Objednávka v dotaze

DeltaSpike nám to umožňuje definovať poradie, v ktorom sa má výsledok vrátiť. Môžeme definovať vzostupné aj zostupné poradie:

verejný abstrakt Zoznam findAllOrderByFirstNameAsc ();

Ako je zobrazené predovšetkým musíme do názvu metódy pridať časť, ktorá obsahuje názov vlastnosti, podľa ktorej chceme triediť, a krátky názov pre smer objednávky.

Mnoho objednávok môžeme ľahko kombinovať:

verejný abstraktný zoznam findAllOrderByFirstNameAscLastNameDesc (); 

Ďalej si ukážeme, ako obmedziť veľkosť výsledku dotazu.

4.6. Obmedzte veľkosť výsledku vyhľadávania a stránkovanie

Existujú prípady použitia, keď chceme z celého výsledku načítať niekoľko prvých riadkov. Je to takzvaný limit dopytu. Je to tiež priame s dátovým modulom:

verejná abstraktná zbierka findTop2OrderByFirstNameAsc (); verejná abstraktná zbierka findFirst2OrderByFirstNameAsc ();

najprv a hore môžu byť použité zameniteľne.

Môžeme potom povoliť stránkovanie dotazu poskytnutím dvoch ďalších parametrov: @FirstResult a @MaxResult:

public abstract Collection findAllOrderByFirstNameAsc (@FirstResult int start, @MaxResults int size);

V úložisku sme už definovali veľa metód. Niektoré z nich sú všeobecné a mali by byť definované raz a použité v každom úložisku.

Apache DeltaSpike poskytuje niekoľko základných typov, pomocou ktorých môžeme mať veľa metód po vybalení z krabice.

V nasledujúcej časti sa zameriame na to, ako to urobiť.

5. Základné typy úložiska

To Ak chcete získať niekoľko základných metód úložiska, malo by naše úložisko rozšíriť základný typ poskytovaný serverom Apache DeltaSpike. Existujú niektoré z nich ako Úložisko entít, FullEntityRepository, atď.:

@Repository verejné rozhranie UserRepository rozširuje FullEntityRepository {// ...}

Alebo pomocou abstraktnej triedy:

@Repository verejná abstraktná trieda UserRepository rozširuje AbstractEntityRepository {// ...} 

Vyššie uvedená implementácia nám poskytuje veľa metód bez toho, aby sme museli písať ďalšie riadky kódu, takže sme získali to, čo sme chceli - masovo redukujeme štandardný kód.

V prípade, že používame typ základného úložiska, nie je potrebné odovzdávať ďalšie forEntity pripisujeme hodnotu nášmu @Úložisko anotácia.

Keď pre naše úložiská používame namiesto rozhraní abstraktné triedy, dostaneme ďalšiu možnosť na vytvorenie vlastného dotazu.

Triedy abstraktných základných úložísk, napr. AbstractEntityRepository nám poskytuje prístup k poliam (pomocou getrov) alebo k užitočným metódam, ktoré môžeme použiť na vytvorenie dotazu:

public List findByFirstName (String firstName) {return typedQuery ("select u from User u where u.firstName =? 1") .setParameter (1, firstName) .getResultList (); } 

Vo vyššie uvedenom príklade sme použili a typedQuery užitočná metóda na vytvorenie vlastnej implementácie.

Poslednou možnosťou na vytvorenie dotazu je použitie @Dopyt anotáciu, ktorú si ukážeme ďalej.

6. @Dopyt Anotácia

The SQL dotaz na vykonanie je možné definovať aj pomocou @Dopyt anotácia. Je to veľmi podobné jarnému riešeniu. K metóde musíme pridať anotáciu s SQL dotazom ako hodnotou.

Predvolene sa jedná o dopyt JPQL:

@Query ("vyberte u z Používateľ u, kde u.firstName =? 1") verejný abstrakt Collection findUsersWithFirstName (reťazec firstName); 

Rovnako ako v predchádzajúcom príklade, aj do dotazu môžeme ľahko odovzdať parametre prostredníctvom indexu.

V prípade, že chceme zadávať dopyt cez natívny SQL namiesto JPQL, musíme definovať ďalší atribút dotazu - je natívny so skutočnou hodnotou:

@Query (value = "select * from User where firstName =? 1", isNative = true) public abstract Collection findUsersWithFirstNameNative (String firstName);

7. Záver

V tomto článku sme sa zaoberali základnou definíciou Apache DeltaSpike a zamerali sme sa na vzrušujúcu časť - dátový modul. Je to veľmi podobné projektu jarných údajov.

Preskúmali sme, ako implementovať vzor úložiska. Taktiež sme predstavili tri možnosti, ako definovať dopyt, ktorý sa má vykonať.

Úplné príklady kódov použitých v tomto článku sú ako vždy k dispozícii na stránkach Github.


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