Bevezetés a Spring Data JPA-ba
1. Áttekintés
Ez a cikk a következőkre fog összpontosítani a Spring Data JPA bevezetése egy tavaszi projektbe és a perzisztencia réteg teljes konfigurálása. A Spring kontextus Java-alapú konfigurációval és az alap Maven pom használatával történő lépésről lépésre történő bemutatásához olvassa el ezt a cikket.
2. A tavaszi adatok által generált DAO - Nincs több DAO-implementáció
Amint arról egy korábbi cikkünkben kitértünk, a DAO réteg általában sok kazánlap kódból áll, amelyeket le lehet és kell egyszerűsíteni. Az ilyen egyszerűsítésnek számos előnye van: a meghatározandó és fenntartandó műtermékek számának csökkenése, az adatelérési minták és a konfiguráció következetessége.
A Spring Data ezt az egyszerűsítést egy lépéssel előrelépi és lehetővé teszi a DAO megvalósítások teljes eltávolítását. A DAO kezelőfelülete most az egyetlen műtárgy, amelyet kifejezetten meg kell határoznunk.
A Spring Data programozási modell JPA-val történő kiaknázásának megkezdéséhez egy DAO interfésznek ki kell terjesztenie a JPA-specifikusat Adattár interfész - JpaRepository. Ez lehetővé teszi a Spring Data számára, hogy megtalálja ezt a felületet, és automatikusan létrehozza annak megvalósítását.
Az interfész kibővítésével megkapjuk a szabványos adatelérés szempontjából a legrelevánsabb CRUD módszereket, amelyek egy standard DAO-ban állnak rendelkezésre.
3. Egyéni hozzáférési módszer és lekérdezések
Ahogy megbeszéltük, az egyik Adattár interfészeket, a DAO-nak már meg lesz határozva és megvalósítva néhány alapvető CRUD módszer (és lekérdezés).
A konkrétabb hozzáférési módszerek meghatározásához a Tavaszi Közgyűlés jó néhány lehetőséget támogat:
- egyszerűen meghatározzon egy új módszert a felületen
- adja meg a tényleges JPQL lekérdezés a @Lekérdezés annotáció
- használja a fejlettebbeket Specifikáció és Querydsl támogatás a Spring Data-ban
- meghatározza egyedi lekérdezések a JPA elnevezett lekérdezéseken keresztül
A harmadik lehetőség - a Specifikációk és a Querydsl támogatás - hasonló a JPA Criteria-hoz, de rugalmasabb és kényelmesebb API-t használ. Ez az egész műveletet sokkal olvashatóbbá és újrafelhasználhatóbbá teszi. Ennek az API-nak az előnyei hangsúlyosabbá válnak, ha nagy számú rögzített lekérdezést kezelünk, mivel ezeket rövidebben kifejezhetnénk kisebb számú újrafelhasználható blokkon keresztül.
Ennek az utolsó lehetőségnek az a hátránya, hogy vagy XML-t tartalmaz, vagy a tartomány osztályt terheli a lekérdezésekkel.
3.1. Automatikus egyéni lekérdezések
Amikor a Spring Data létrehoz egy újat Adattár megvalósításakor elemzi az interfészek által definiált összes módszert és megpróbálja automatikusan generál lekérdezéseket a metódus nevekből. Bár ennek vannak bizonyos korlátai, nagyon hatékony és elegáns módszer az új egyedi hozzáférési módszerek meghatározására, nagyon kevés erőfeszítéssel.
Nézzünk meg egy példát: ha az entitásnak van egy név mező (és a Java Bean szabvány getName és setName mód), meghatározzuk a findByName módszer a DAO felületen; ez automatikusan létrehozza a helyes lekérdezést:
nyilvános felület Az IFooDAO kiterjeszti a JpaRepository {Foo findByName (karakterlánc neve); }
Ez egy viszonylag egyszerű példa. A lekérdezés-létrehozási mechanizmus sokkal nagyobb kulcsszókészletet támogat.
Abban az esetben, ha az elemző nem tudja egyeztetni a tulajdonságot a tartományobjektum mezővel, a következő kivételt látjuk:
java.lang.IllegalArgumentException: Nem található tulajdonságnév a com.baeldung.spring.data.persistence.model.Foo osztályhoz.
3.2. Manuális egyéni lekérdezések
Most nézzünk meg egy egyéni lekérdezést, amelyet a @Lekérdezés kommentár:
@Query ("KIVÁLASZTÁS FOO-BÓL F WHERE LOWER (f.név) = LOWER (: név)") Foo retrieveByName (@Param ("név") String név);
A lekérdezések létrehozásának még finomabb ellenőrzéséhez, például megnevezett paraméterek használatához vagy a meglévő lekérdezések módosításához a hivatkozás jó kezdő.
4. Tranzakció konfigurálása
A tavasszal kezelt DAO tényleges megvalósítása valóban rejtve van, mivel nem közvetlenül dolgozunk vele. Ez azonban elég egyszerű megvalósítás - a SimpleJpaRepository - amely annotációk segítségével határozza meg a tranzakciós szemantikát.
Pontosabban: ez csak olvashatót használ @ Tranzakció osztályszintű kommentár, amelyet a nem csak olvasható módszerek felülírnak. A tranzakciós szemantika többi része alapértelmezett, de ezeket manuálisan felül lehet írni módszerenként.
4.1. Kivételes fordítás él és jól működik
A kérdés most - mivel a Spring Data JPA nem függ a régi ORM sablonoktól (JpaTemplate, HibernateTemplate), és az 5. tavasz óta eltávolításra kerültek - a közös parlamenti közgyűlés kivételeit még mindig lefordítjuk a tavaszi fordulóra DataAccessException hierarchia?
Természetesen, mi vagyunk - kivétel fordítását továbbra is engedélyezi a @Raktár annotáció a DAO-n. Ez a megjegyzés lehetővé teszi a tavaszi bab utófeldolgozójának, hogy mindenkinek tanácsot adjon @Raktár bab az összes PersistenceExceptionTranslator a tárolóban található példányok, és kivételes fordítást nyújtanak, csakúgy, mint korábban.
Ellenőrizzük a kivétel fordítását egy integrációs teszttel:
@Test (várható = DataIntegrityViolationException.class) public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException () {service.create (new Foo ()); }
Tartsd észben, hogy a kivétel fordítása proxykon keresztül történik. Annak érdekében, hogy Spring képes legyen meghatalmazottakat létrehozni a DAO osztályok körül, ezeket nem szabad deklarálni végső.
5. Tavaszi adatok JPA-adattár konfigurálása
A tavaszi JPA adattár támogatásának aktiválásához használhatjuk a @EnableJpaRepositories jelölést és adja meg a DAO interfészeket tartalmazó csomagot:
@EnableJpaRepositories (basePackages = "com.baeldung.spring.data.persistence.repository") public class PersistenceConfig {...}
Ugyanezt megtehetjük egy XML konfigurációval is:
6. Java vagy XML konfiguráció
Korábbi cikkünkben már nagyon részletesen megvitattuk a JPA konfigurálását tavasszal. A Spring Data kihasználja Spring közös támogatásának támogatását is @PersistenceContext annotáció. Ezt használja a vezeték bekötésére EntityManager a DAO tényleges megvalósításainak létrehozásáért felelős tavaszi gyárba - JpaRepositoryFactoryBean.
A már tárgyalt konfiguráció mellett be kell vonnunk a Spring Data XML Config-et is - ha XML-t használunk:
@Configuration @EnableTransactionManagement @ImportResource ("classpath *: * springDataConfig.xml") public class PersistenceJPAConfig {...}
7. Maven-függőség
A JPA Maven konfigurációján kívül, hasonlóan egy előző cikkhez, hozzáadjuk a spring-data-jpa függőség:
org.springframework.data spring-data-jpa 2.2.7.KÖZLEMÉNY
8. A Spring Boot használata
Használhatjuk a Spring Boot Starter Data JPA függőséget is, amely automatikusan konfigurálja a Adatforrás nekünk.
Biztosítanunk kell azt is, hogy a használni kívánt adatbázis jelen van-e az osztályútvonalon. Példánkban felvettük a H2 memóriában lévő adatbázist:
org.springframework.boot spring-boot-starter-data-jpa 2.2.6. KÖZLEMÉNY com.h2database h2 1.4.200
Ennek eredményeként csak ezen függőségek elvégzésével az alkalmazásunk működik és működik, és más adatbázis-műveletekhez felhasználhatjuk.
A standard Spring alkalmazás kifejezett konfigurációja mostantól a Spring Boot automatikus konfigurálás részeként szerepel.
Természetesen módosíthatjuk az automatikus konfigurációt a testreszabott explicit konfiguráció hozzáadásával.
A Spring Boot egyszerű módot kínál erre a alkalmazás.tulajdonságok fájl:
spring.datasource.url = jdbc: h2: mem: db; DB_CLOSE_DELAY = -1 spring.datasource.username = sa spring.datasource.password = sa
Ebben a példában megváltoztattuk a kapcsolat URL-jét és hitelesítő adatait.
9. Következtetés
Ez a cikk a perzisztencia réteg konfigurálásáról és megvalósításáról volt szó az Spring 5, a JPA 2 és a Spring Data JPA (a Spring Data esernyő projekt része) XML és Java alapú konfigurációjával.
Megbeszéltük a további meghatározás módjait speciális egyéni lekérdezések, továbbá tranzakciós szemantika, és a konfiguráció az újval jpa névtér. A végeredmény az adatelérés új és elegáns felvétele a Spring segítségével, szinte semmilyen tényleges megvalósítási munka nélkül.
A Spring Data JPA oktatóanyag megvalósítása megtalálható a GitHub projektben.