Jarné vymazanie údajov JPA a vzťahy

1. Prehľad

V tomto tutoriáli sa pozrieme na to, ako sa mazanie vykonáva v Spring Data JPA.

2. Vzorová entita

Ako vieme z referenčnej dokumentácie Spring Data JPA, rozhrania úložiska nám poskytujú základnú podporu pre entity.

Ak máme entitu, ako a Kniha:

@Entity public class Book {@Id @GeneratedValue private Long id; súkromný názov reťazca; // štandardné konštruktory // štandardné getre a setre}

Potom môžeme rozšíriť Spring Data JPA Úložisko Crud aby nám umožnil prístup k operáciám CRUD dňa Kniha:

@Repository verejné rozhranie BookRepository rozširuje CrudRepository {}

3. Odstrániť z úložiska

Okrem iného Úložisko Crud obsahuje dve metódy: deleteById a vymazať všetko.

Vyskúšajme tieto metódy priamo z našej BookRepository:

@RunWith (SpringRunner.class) @SpringBootTest (classes = {Application.class}) verejná trieda DeleteFromRepositoryUnitTest {@Autowired súkromné ​​úložisko BookRepository; Kniha kniha1; Kniha kniha2; Zoznam kníh; // inicializácia dát @Test public void whenDeleteByIdFromRepository_thenDeletingShouldBeSuccessful () {repository.deleteById (book1.getId ()); assertThat (repository.count ()). isEqualTo (1); } @Test public void whenDeleteAllFromRepository_thenRepositoryShouldBeEmpty () {repository.deleteAll (); assertThat (repository.count ()). isEqualTo (0); }}

A to aj napriek tomu, že používame Úložisko CrudUpozorňujeme, že rovnaké metódy existujú aj pre iné rozhrania Spring Data JPA JpaRepository alebo PagingAndSortingRepository.

4. Odvodený dotaz na odstránenie

Môžeme tiež odvodiť metódy dotazu na odstránenie entít. Existuje súbor pravidiel pre ich písanie, ale zamerajme sa len na najjednoduchší príklad.

Odvodený dotaz na odstránenie musí začínať deleteBy, za ktorým nasleduje názov výberových kritérií. Tieto kritériá musia byť uvedené volanie metódy.

Povedzme, že to chceme vymazať Knihas tým titul. Použitím konvencie pomenovania by sme začali deleteBy a zoznam titul ako naše kritériá:

@Repository verejné rozhranie BookRepository rozširuje CrudRepository {long deleteByTitle (názov reťazca); }

Návratová hodnota typu dlho, označuje koľko záznamov bola metóda vymazaná.

Napíšme test a uistite sa, že je správny:

@Test @Transactional public void whenDeleteFromDerivedQuery_thenDeletingShouldBeSuccessful () {long deletedRecords = repository.deleteByTitle ("The Hobbit"); assertThat (deletedRecords) .isEqualTo (1); }

Pretrvávanie a mazanie objektov v JPA si vyžaduje transakciu, preto by sme mali použiť a @ Transakčné anotáciu pri použití týchto odvodených dotazov na odstránenie, aby ste sa uistili, že transakcia beží. Toto je podrobne vysvetlené v dokumentácii ORM s pružinou.

5. Vlastný dotaz na odstránenie

Názvy metód pre odvodené dotazy môžu byť pomerne dlhé a sú obmedzené iba na jednu tabuľku.

Keď potrebujeme niečo zložitejšie, môžeme napísať vlastný dotaz pomocou @Dopyt a @ Úpravy spolu.

Poďme skontrolovať ekvivalentný kód pre našu odvodenú metódu z minulosti:

@Modifying @Query ("delete from Book b where b.title =: title") void deleteBooks (@Param ("title") String title);

Opäť môžeme overiť, že to funguje, pomocou jednoduchého testu:

@Test @Transactional public void whenDeleteFromCustomQuery_thenDeletingShouldBeSuccessful () {repository.deleteBooks ("Hobit"); assertThat (repository.count ()). isEqualTo (1); }

Obe vyššie uvedené riešenia sú podobné a dosahujú rovnaký výsledok. Využívajú však trochu iný prístup.

The @Dopyt metóda vytvorí jeden dotaz JPQL proti databáze. Na porovnanie deleteBy metódy vykonajú načítaný dotaz, potom postupne vymažú každú z položiek.

6. Vymazať vo vzťahoch

Pozrime sa teraz, čo sa stane, keď budeme mať vzťahy s inými subjektmi.

Predpokladajme, že máme a Kategória subjekt, ktorý má a OneToMany združenie s Kniha subjekt:

@Entity public class Kategória {@Id @GeneratedValue private Long id; súkromné ​​meno reťazca; @OneToMany (mappedBy = "kategória", cascade = CascadeType.ALL, orphanRemoval = true) súkromné ​​zoznamy kníh; // štandardné konštruktory // štandardné getre a setre}

The KategóriaÚložisko môže byť iba prázdne rozhranie, ktoré sa rozširuje Úložisko Crud:

@Repository verejné rozhranie CategoryRepository rozširuje CrudRepository {}

Mali by sme tiež upraviť Kniha subjekt odrážajúci toto združenie:

@ManyToOne súkromná kategória kategórie;

Poďme teraz pridať dve kategórie a spojiť ich s knihami, ktoré momentálne máme. Ak sa teraz pokúsime odstrániť kategórie, odstránia sa aj knihy:

@Test public void whenDeletingCategories_thenBooksShouldAlsoBeDeleted () {categoryRepository.deleteAll (); assertThat (bookRepository.count ()). isEqualTo (0); assertThat (categoryRepository.count ()). isEqualTo (0); }

Nie je to však obojsmerné. To znamená, že ak knihy odstránime, kategórie tu stále budú:

@Test public void whenDeletingBooks_thenCategoriesShouldAlsoBeDeleted () {bookRepository.deleteAll (); assertThat (bookRepository.count ()). isEqualTo (0); assertThat (categoryRepository.count ()). isEqualTo (2); }

Toto správanie môžeme zmeniť zmenou vlastností vzťahu, napríklad CascadeType.

7. Záver

V tomto článku sme sa zaoberali rôznymi spôsobmi odstránenia entít v Spring Data JPA. Pozreli sme sa na poskytnuté spôsoby odstránenia z Úložisko Crud, ako aj naše odvodené dotazy alebo vlastné dotazy, ktoré používame @Dopyt anotácia.

Pozreli sme sa tiež na to, ako sa mazanie robí vo vzťahoch. Ako vždy, všetky útržky kódu uvedené v tomto článku nájdete v našom úložisku GitHub.


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