Spring Data JPA törlés és kapcsolatok

1. Áttekintés

Ebben az oktatóanyagban megnézzük, hogyan történik a törlés a Spring Data JPA-ban.

2. Minta entitás

Mint a Spring Data JPA referenciadokumentációjából tudjuk, a repository interfészek alapvető támogatást nyújtanak számunkra az entitások számára.

Ha van egy entitásunk, például a Könyv:

@Entity public class Book {@Id @GeneratedValue private Long id; privát húr cím; // szabványos kivitelezők // szabványos szerelők és beállítók}

Ezután kibővíthetjük a Spring Data JPA-kat CrudRepository hogy hozzáférést nyújtsunk a CRUD műveletekhez Könyv:

@Repository nyilvános felület A BookRepository kiterjeszti a CrudRepository {}

3. Törlés a tárból

Többek között CrudRepository két módszert tartalmaz: deleteById és mindet törölni.

Teszteljük ezeket a módszereket közvetlenül a mi BookRepository:

@RunWith (SpringRunner.class) @SpringBootTest (class = {Application.class}) public class DeleteFromRepositoryUnitTest {@Autowired private BookRepository repository; Könyvkönyv1; Könyvkönyv2; Könyvek felsorolása; // adatok inicializálása @Test public void whenDeleteByIdFromRepository_thenDeletingShouldBeSuccessful () {repository.deleteById (book1.getId ()); assertThat (adattár.szám ()). isEqualTo (1); } @Test public void whenDeleteAllFromRepository_thenRepositoryShouldBeEmpty () {repository.deleteAll (); assertThat (adattár.szám ()). isEqualTo (0); }}

És annak ellenére, hogy használjuk CrudRepository, vegye figyelembe, hogy ugyanazok a módszerek léteznek más Spring Data JPA interfészekhez is, mint például JpaRepository vagy PagingAndSortingRepository.

4. Származtatott lekérdezés törlése

Az entitások törléséhez lekérdezési módszereket is levezethetünk. Van egy szabályrendszer azok megírásához, de csak a legegyszerűbb példára koncentrálunk.

A származtatott törlési lekérdezésnek kezdődnie kell deleteBy, amelyet a kiválasztási kritériumok neve követ. Ezeket a kritériumokat meg kell adni a metódushívásban.

Tegyük fel, hogy törölni akarunk Könyvs által cím. A névadási eljárás használatával kezdjük deleteBy és sorolja fel cím mint kritériumaink:

@Repository nyilvános felület A BookRepository kiterjeszti a CrudRepository {long deleteByTitle (String title); }

A visszatérési érték, típus hosszú, azt jelzi, hogy a metódust hány rekord törölte.

Írjunk egy tesztet, és győződjünk meg arról, hogy ez helyes:

@Test @Transactional public void whenDeleteFromDerivedQuery_thenDeletingShouldBeSuccessful () {long deletedRecords = repository.deleteByTitle ("A hobbit"); assertThat (törölveRecords) .isEqualTo (1); }

Az objektumok JPA-ban való tartása és törlése tranzakciót igényel, ezért használnunk kell a @ Tranzakció megjegyzés ezeknek a származtatott törlési lekérdezéseknek a használatakor, hogy megbizonyosodjon egy tranzakció futásáról. Ezt részletesen az ORM with Spring dokumentációval magyarázzák.

5. Egyéni törlési lekérdezés

A származtatott lekérdezések metódusnevei meglehetősen hosszúak lehetnek, és csak egyetlen táblára korlátozódnak.

Ha valami összetettebbre van szükségünk, akkor egy egyéni lekérdezést írhatunk @Lekérdezés és @ Módosító együtt.

Ellenőrizzük a korábbi származtatott módszer ekvivalens kódját:

@Modifying @Query ("törlés a b könyvből, ahol b.title =: title") érvénytelen deleteBooks (@Param ("title") karakterlánc címe);

Ismét egy egyszerű teszt segítségével ellenőrizhetjük, hogy működik-e:

@Test @Transactional public void whenDeleteFromCustomQuery_thenDeletingShouldBeSuccessful () {repository.deleteBooks ("A hobbit"); assertThat (adattár.szám ()). isEqualTo (1); }

Mindkét fent bemutatott megoldás hasonló és ugyanazt az eredményt éri el. Ugyanakkor kissé más megközelítést alkalmaznak.

A @Lekérdezés metódus egyetlen JPQL lekérdezést hoz létre az adatbázissal szemben. Ehhez képest: deleteBy metódusok végrehajtanak egy olvasott lekérdezést, majd az egyes elemeket egyenként törlik.

6. Törölje a Kapcsolatok részben

Most nézzük meg, mi történik, ha megtörténik kapcsolatok más entitásokkal.

Tegyük fel, hogy van egy Kategória entitás, amelynek van egy Egy a sokhoz társulás a Könyv entitás:

@Entity public class Kategória {@Id @GeneratedValue private Long id; privát karakterlánc neve; @OneToMany (mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true) privát lista könyvek; // szabványos kivitelezők // szabványos szerelők és beállítók}

A CategoryRepository csak egy üres felület lehet, amely kiterjed CrudRepository:

@Repository nyilvános felület A CategoryRepository kiterjeszti a CrudRepository {}

Módosítanunk kell a Könyv entitás tükrözi ezt a társulást

@ManyToOne privát kategória kategória;

Adjunk hozzá most két kategóriát, és társítsuk őket a jelenleg rendelkezésünkre álló könyvekhez. Ha megpróbáljuk törölni a kategóriákat, akkor a könyvek is törlődnek:

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

Ez azonban nem kétirányú. Ez azt jelenti, hogy ha töröljük a könyveket, a kategóriák továbbra is megvannak:

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

Megváltoztathatjuk ezt a viselkedést a kapcsolat tulajdonságainak megváltoztatásával, például a CascadeType.

7. Következtetés

Ebben a cikkben az entitások törlésének különböző módjait vizsgáltuk meg a Spring Data JPA-ban. Megnéztük a megadott törlési módszereket CrudRepository, valamint származtatott lekérdezéseinket vagy a @Lekérdezés annotáció.

Megnéztük azt is, hogy a kapcsolatokban hogyan történik a törlés. Mint mindig, a cikkben említett összes kódrészlet megtalálható a GitHub-adattárunkban.