2014-01-07 12 views
6

Ich versuche, meinen Kopf um JPA zu wickeln und habe ziemlich viel gelernt. JPA ist eine Java-Spezifikation und Provider implementieren diese Spezifikation. Ich verstehe diesen Teil.Wie beziehen sich Spring-Daten (JPA) auf JPA-Persistenzanbieter?

Was ich nicht verstehe ist, wie Spring Data ins Bild kommt. Ist Spring Data auch ein Anbieter wie Hibernate oder OpenJPA? Wenn nicht, was ist es? Wie erleichtert Spring Data die Arbeit?

+0

Sie fragen nach Spring Data JPA? – dhamibirendra

+0

ja dieses Frühjahr Daten jpa: http://projects.spring.io/spring-data-jpa/ – user1099123

+0

Spring Data JPA implementiert automatisch gemeinsame JPA-Datenzugriffsmethoden für Sie nur basierend auf den Entity-Objekten. Es basiert auf Grails Object Relational Mapping (GORM) und verwendet die gleichen Konventionen. Die Namen der automatisch erstellten Methoden beschreiben auch, was die Methode zurückgibt. Wenn Sie ein Objekt Foo mit Eigenschaftsleiste haben und alle Foos eines bestimmten Balkens finden möchten, rufen Sie einfach die automatisch erstellte Methode Foo.findByBar() auf. Nehmen wir an, Foo hat eine dateCreated -Eigenschaft und Sie möchten alle Foos finden, die in einem bestimmten Zeitraum erstellt wurden. Verwenden Sie also Foo.findByDateCreatedBetween (firstDate, secondDate) –

Antwort

2

Denken Sie an Spring Data, um JPA und viele andere Persistenzmodelle auf eine Weise zu unterstützen, die für Ihren eigenen Code transparent ist. Spring Data erleichtert es Ihnen, mehr Arten von Datenquellensystemen in einer einheitlichen Oberfläche zu bearbeiten. Ohne Spring Data müssen Sie jedes Mal mehr Adapter in Ihren Code einfügen, wenn Sie mit zusätzlicher Logik arbeiten müssen.

12

Das Spring Data Projekt im Allgemeinen ist ein Umbrella-Projekt mit folgendem Leitbild:

... bieten ein vertrautes und konsistentes Frühling-basiertes Programmiermodell, während filialspezifischen Funktionen und Fähigkeiten zu halten.

So nähern wir uns dem Persistenzraum im Allgemeinen nicht nur relationalen Datenzugriff durch JPA. Das wichtige Stück hier ist zweifach:

  1. Programmiermodell statt generische API
  2. Unterstützung für Speicher Besonderheiten

Da der Datenzugriffs Raum so vielfältig ist in diesen Tage, versuchen, alle zu nähern Die Geschäfte mit einer einheitlichen API sind zum Scheitern verurteilt. Sie würden mit einem kleinsten gemeinsamen Nenner enden, der die Laden spezifischen Teile verbirgt - in Zeiten, in denen Sie selektiv einen bestimmten Laden wählen weil seiner Spezifika. Abstrahieren diese weg völlig unterminiert dies. Insbesondere der Versuch, JPA zu verwenden, ist unserer Meinung nach falsch, da es per Definition eng mit relationalen Konzepten (@Table, Joins, Transaktionen) verbunden ist.

Dennoch möchten Sie nicht mit völlig verschiedenen APIs arbeiten, wollen nicht in Store-Unterschiede verloren gehen, wenn Sie mit mehreren arbeiten oder von einem Projekt zum anderen wechseln. Spring hat in dieser Hinsicht traditionell dazu beigetragen, ein konsistentes Programmiermodell zu verwenden, das Abstraktionen enthält, die auf die gleiche Weise funktionieren, aber immer noch für eine bestimmte Technologie spezifisch sind. Zum Beispiel sind JDBC und JMS völlig unterschiedliche Technologien. Spring bietet sowohl einen JdbcTemplate als auch einen JmsTemplate an, die dieselben Verantwortlichkeiten abdecken (Ressourcenmanagement und Ausnahmeübersetzung) und die Lernkurve verringern, wenn Sie von JDBC zu JMS oder umgekehrt wechseln.

Spring Data greift darauf zu, indem es geschäftsspezifische Funktionen durch Abstraktionen kennt, die die Entwickler von Spring kennen. Ich habe bereits die Vorlage erwähnt, aber das beinhaltet auch allgemeine Konfigurationsmechanismen (XML-Namespaces, unter Verwendung von DI und AOP usw.).

Repositorys

Die oberste Schicht dieses Programmiermodell ist die Abstraktion Repository. In seinem Kern vereinfacht es die Entwicklung von Datenzugriffsschichten erheblich, da Sie vermeiden können, mehr Implementierungscode zu schreiben als unbedingt erforderlich. Es bietet CRUD-Funktionalität (out of the box), Paginierung sowie deklarative Abfragemethoden.

Angenommen, eine Customer Domain-Klasse.Aktivieren der Persistenz für es ist nur eine Frage der ein Repository-Schnittstelle wie folgt erklärt:

interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> { 

    List<Customer> findByLastnameContaining(String lastname); 
} 

Jetzt ist es eine Frage der Konfiguration (und Domain-Klasse-Mapping) in der Lage sein, eine Instanz dieser Schnittstelle zu erstellen und sie von einem verwenden Klient. PagingAndSortingRepository enthält grundlegende CRUD-Funktionalität sowie Sachen wie Page<Customer> findAll(Pageable pageable) (so Seite-für-Seite-Zugriff). Wie Sie sehen können, unterstützen wir auch einen Abfrageableitungsmechanismus, damit Sie keinen Implementierungscode für einfache Abfragen schreiben müssen. Für komplexere erlauben wir die manuelle Deklaration (z. B. mit @Query auf der Methode) oder sogar die manuelle Implementierung, falls erforderlich.

Eine nette Nebenwirkung hier ist, dass Sie mit einem Flip-Schalter in der Konfiguration die gleiche Repository-Schnittstelle verwenden können, um Customer Instanzen in einer MongoDB zu erhalten. Das heißt nicht, dass wir uns blind von einem Laden zum nächsten bewegen, da die Geschäfte in der Regel eine Anpassung des Datenmodells benötigen, um effizient arbeiten zu können. Entwickler können jedoch schnell zwischen Projekten wechseln, die mit verschiedenen Speichern arbeiten, da die Repositories auf die gleiche Weise arbeiten (indem das Programmiermodell über den üblichen API-Ansatz implementiert wird).

JPA Besonderheiten

Spring Data JPA ist eigentlich eine dünne Schicht auf das Repository Abstraktion sowie ein paar andere Glocken und Trillerpfeifen zu implementieren. Wir ersetzen also Persistenzanbieter nicht, sondern setzen sie tatsächlich über die API ein und mildern sogar einige Eigenarten und Unterschiede zwischen einzelnen JPA-Anbietern.

+0

Detaillierte Antwort, aber es beantwortet nicht die grundlegende Frage "Ist Spring Data JPA ein Anbieter oder ist es eine Schicht über JPA, die immer noch einen Anbieter (OpenJPA, Hibernate, EclipseLink, etc.) darunter benötigt?" –

+1

Haben Sie den allerletzten Absatz gelesen? ;) –

Verwandte Themen