Einführung in Spring Data JPA

Einführung in Spring Data JPA

1. Überblick

Dieser Artikel konzentriert sich aufintroducing Spring Data JPA into a Spring project und die vollständige Konfiguration der Persistenzschicht. Eine schrittweise Einführung zum Einrichten des Spring-Kontexts mithilfe der Java-basierten Konfiguration und des grundlegenden Maven-POM für das Projekt finden Sie unterthis article. [more-838] #

2. Die Frühlingsdaten generierten DAO - keine DAO-Implementierungen mehr

Wie wir in einem früheren Artikel besprochen haben, bestehtthe DAO layer normalerweise aus viel Boilerplate-Code, der vereinfacht werden kann und sollte. Die Vorteile einer solchen Vereinfachung sind vielfältig: Verringerung der Anzahl der Artefakte, die definiert und verwaltet werden müssen, Konsistenz der Datenzugriffsmuster und Konsistenz der Konfiguration.

Spring Data macht diese Vereinfachung einen Schritt vorwärts undmakes it possible to remove the DAO implementations entirely. Die Schnittstelle des DAO ist jetzt das einzige Artefakt, das wir explizit definieren müssen.

Um das Spring Data-Programmiermodell mit JPA nutzen zu können, muss eine DAO-Schnittstelle die JPA-spezifischeRepository-Schnittstelle -JpaRepository erweitern. Dadurch kann Spring Data diese Schnittstelle finden und automatisch eine Implementierung dafür erstellen.

Durch die Erweiterung der Schnittstelle erhalten wir die relevantesten CRUD-Methoden für den Standarddatenzugriff, die in einem Standard-DAO verfügbar sind.

3. Benutzerdefinierte Zugriffsmethode und Abfragen

Wie diskutiert,by implementing one of the Repository interfaces, the DAO will already have some basic CRUD methods (and queries) defined and implemented.

Um spezifischere Zugriffsmethoden zu definieren, unterstützt Spring JPA einige Optionen:

  • einfachdefine a new method in der Schnittstelle

  • Geben Sie die tatsächlichenJPQ query an, indem Sie die Annotation@Query verwenden

  • Verwenden Sie die erweitertenSpecification and Querydsl support in Spring Data

  • Definieren Siecustom queries über JPA Named Queries

third option - die Unterstützung für Spezifikationen und Querydsl - ähnelt den JPA-Kriterien, verwendet jedoch eine flexiblere und bequemere API. Dies macht die gesamte Operation viel lesbarer und wiederverwendbarer. Die Vorteile dieser API werden bei der Verarbeitung einer großen Anzahl von festen Abfragen deutlicher, da diese möglicherweise durch eine geringere Anzahl von wiederverwendbaren Blöcken präziser ausgedrückt werden können.

Diese letzte Option hat den Nachteil, dass sie entweder XML umfasst oder die Domänenklasse mit den Abfragen belastet.

3.1. Automatische benutzerdefinierte Abfragen

Wenn Spring Data eine neue Implementierung vonRepositoryerstellt, analysiert es alle von den Schnittstellen definierten Methoden und versucht,automatically generate queries from the method names zu implementieren. Dies hat zwar einige Einschränkungen, ist jedoch eine sehr leistungsstarke und elegante Möglichkeit, neue benutzerdefinierte Zugriffsmethoden mit sehr geringem Aufwand zu definieren.

Schauen wir uns ein Beispiel an: Wenn die Entität einname-Feld hat (und die Java Bean-StandardmethodengetName undsetName),we’ll define the findByName method in the DAO interface; Dadurch wird automatisch die richtige Abfrage generiert:

public interface IFooDAO extends JpaRepository {

   Foo findByName(String name);

}

Dies ist ein relativ einfaches Beispiel. Der Mechanismus zur Erstellung von Abfragen unterstützta much larger set of keywords.

Falls der Parser die Eigenschaft nicht mit dem Domänenobjektfeld abgleichen kann, wird die folgende Ausnahme angezeigt:

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo

3.2. Manuelle benutzerdefinierte Abfragen

Schauen wir uns nun eine benutzerdefinierte Abfrage an, die wir über die Annotation@Querydefinieren:

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);

the reference ist ein guter Ausgangspunkt, um die Erstellung von Abfragen noch genauer zu steuern, z. B. benannte Parameter zu verwenden oder vorhandene Abfragen zu ändern.

4. Transaktionskonfiguration

Die tatsächliche Implementierung des von Spring Data verwalteten DAO ist in der Tat verborgen, da wir nicht direkt damit arbeiten. Dies ist jedoch eine recht einfache Implementierung - the SimpleJpaRepository – which defines transaction semantics using annotations.

Dies verwendet expliziter eine schreibgeschützte@Transactional-Annotation auf Klassenebene, die dann für die nicht schreibgeschützten Methoden überschrieben wird. Der Rest der Transaktionssemantik ist Standard, kann jedoch manuell pro Methode überschrieben werden.

4.1. Ausnahme Übersetzung ist lebendig und gut

Die Frage ist nun, ob wir die Ausnahmeübersetzung durch die Verwendung von Spring Data JPA verlieren, da wir nicht die Standardvorlagen für Spring ORM (JpaTemplate,HibernateTemplate) verwenden. Werden wir unsere JPA-Ausnahmen nicht in dieDataAccessException-Hierarchie von Spring übersetzen lassen?

Natürlich nicht -exception translation is still enabled by the use of the @Repository annotation on the DAO. Diese Annotation ermöglicht es einem Spring Bean-Postprozessor, alle@Repository-Beans mit allen im Container gefundenenPersistenceExceptionTranslator-Instanzen zu beraten und wie zuvor eine Ausnahmeübersetzung bereitzustellen.

Überprüfen wir die Ausnahmeübersetzung mit einem Integrationstest:

@Test(expected = DataIntegrityViolationException.class)
public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException() {
    service.create(new Foo());
}

Beachten Sie, dassexception translation is done through proxies. Damit Spring Proxys um die DAO-Klassen erstellen kann, dürfen diese nicht alsfinal deklariert werden.

5. Federdatenkonfiguration

Um die Spring JPA-Repository-Unterstützung zu aktivieren, können Sie die Annotation@EnableJpaRepositoriesverwenden und das Paket angeben, das die DAO-Schnittstellen enthält:

@EnableJpaRepositories(basePackages = "com.example.jpa.dao")
public class PersistenceConfig { ... }

Mit einer XML-Konfiguration können wir dasselbe tun:

6. Die Spring Java- oder XML-Konfiguration

Wir haben bereits in einem früheren Artikel ausführlich besprochen, wie manconfigure JPA in Spring macht. Spring Data nutzt auch die Spring-Unterstützung für die Annotation von JPA@PersistenceContext. Damit werden dieEntityManager mit der Spring Factory Bean verbunden, die für die Erstellung der eigentlichen DAO-Implementierungen verantwortlich ist -JpaRepositoryFactoryBean.

Zusätzlich zu der bereits diskutierten Konfiguration müssen wir auch die Spring Data XML Config einbinden - wenn wir XML verwenden:

@Configuration
@EnableTransactionManagement
@ImportResource( "classpath*:*springDataConfig.xml" )
public class PersistenceJPAConfig{
   ...
}

7. Die Maven-Abhängigkeit

Zusätzlich zur Maven-Konfiguration für JPA-definiert inprevious article wird die Abhängigkeit vonspring-data-jpa hinzugefügt:


   org.springframework.data
   spring-data-jpa
   2.1.6.RELEASE

8. Spring Boot verwenden

Wir können auch die Abhängigkeit vonSpring Boot Starter Data JPAverwenden, die die DataSource automatisch für uns konfiguriert.

Wir müssen auch sicherstellen, dass die Datenbank, die wir verwenden möchten, im Klassenpfad vorhanden ist. In unserem Beispiel haben wir die H2-In-Memory-Datenbank hinzugefügt:


   org.springframework.boot
   spring-boot-starter-data-jpa
   2.1.3.RELEASE


    com.h2database
    h2
    1.4.197

Das ist es, nur weil wir diese Abhängigkeiten erfüllen, ist unsere Anwendung betriebsbereit und wir können sie für andere Datenbankoperationen verwenden.

Die explizite Konfiguration für eine Standard-Spring-Anwendung ist jetzt Teil der automatischen Spring Boot-Konfiguration.

Natürlich können wir die automatische Konfiguration ändern, indem wir unsere eigene explizite Konfiguration hinzufügen.

Spring Boot bietet eine einfache Möglichkeit, dies mithilfe von Eigenschaften in der Dateiapplication.propertieszu tun:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

In diesem Beispiel haben wir die Verbindungs-URL und die Anmeldeinformationen geändert.

9. Fazit

Dieser Artikel befasste sich mit der Konfiguration und Implementierung der Persistenzschicht mit Spring 4, JPA 2 und Spring Data JPA (Teil des Spring Data-Umbrella-Projekts) unter Verwendung von XML- und Java-basierter Konfiguration.

Wir haben Möglichkeiten diskutiert, mehradvanced custom queries sowieconfiguration with the new jpa namespace und Transaktionssemantik zu definieren. Das Endergebnis ist eine neue und elegante Variante des Datenzugriffs mit Spring, bei der praktisch keine Implementierungsarbeiten erforderlich sind.

Die Implementierung dieses Spring Data JPA-Tutorials finden Sie inthe GitHub project.