Wie unterscheidet sich Spring Data JPA von Hibernate für große Projekte?

129

Es fällt mir schwer zu entscheiden, ob ich für ein neues Projekt bei Hibernate bleiben oder mich mit JPA und der neuen Spring Data-Implementierung nass machen soll.

Ist das Spring Data Framework für große Projekte oder kleine Projekte mit geringen Abfrageanforderungen gedacht?

Ich sehe zwar den Vorteil der Code-Reduzierung durch die Verwendung der @QueryAnmerkung, aber was tun Sie für dynamische Abfragen? Was ist, wenn Sie eine ziemlich komplexe save () -Methode implementieren möchten?

In der Dokumentation wird angegeben, dass eine benutzerdefinierte Schnittstelle und Implementierung erstellt werden soll, die von Ihrem Haupt-Repository implementiert wird. Was ist jedoch, wenn Sie auf Super-Methoden im Crud-Repository selbst zugreifen müssen? Das Crud-Repository implementiert das benutzerdefinierte Repository - nicht umgekehrt. Es scheint ein seltsames Design zu sein.

Ich bin mir nicht sicher, ob dieses Framework den Herausforderungen komplexer und großer Anwendungen gerecht wird. Ich habe noch nie viele Probleme mit Hibernate gehabt, und ich denke darüber nach, bei der guten alten Zuverlässigkeit zu bleiben, anstatt mich für Spring Data JPA zu entscheiden.

Was soll ich machen? Welche unvorhergesehenen Komplikationen und Kosten treten auf, wenn ich mich für Spring Data JPA entscheide?

egervari
quelle
1
Soweit ich weiß, macht es wenig Unterschied. Gehen Sie mit dem, mit dem Sie sich wohler fühlen. Warum die Debatte?
Duffymo
1
Ich fühle mich mit Hibernate natürlich viel wohler, aber wenn ich die gleichen Dinge tun und produktiver sein kann, würde ich lieber die neueren Ansätze wählen. Wenn der Ruhezustand jedoch immer noch leistungsfähiger ist und ich auf viel weniger Probleme stoßen werde, würde ich dies gerne wissen.
Egervari
3
JPA ist eine Verallgemeinerung von ORM, die Hibernate als eine von vielen Implementierungen verwendet. Welche Kräfte schreiben Sie einander zu? JPA ist ein Standard, aber ich sehe kaum einen Unterschied zwischen den beiden. Im Interesse einer vollständigen Offenlegung werde ich sagen, dass mir keiner von beiden wichtig ist. Beide generieren SQL für Sie. Ich würde es lieber selbst schreiben. ORM ist nicht für jedes Problem und jeden Benutzer geeignet.
Duffymo
1
Genau. Wenn es nur um JPA oder Hibernate geht, würde ich jedes Mal Hibernate wählen. Ich mag die JPA-Implementierung alleine ehrlich gesagt nicht so sehr. Die IDE-Unterstützung in IDEA ist eigentlich immer noch schlecht, und es wird sich beschweren, wenn die Zuordnungen beim Start der Anwendung nicht korrekt sind, anstatt die Komponententests laufen zu lassen. Es gibt viele andere Nitpicks, die ich mit JPA habe. Ich mag die alten XML-Zuordnungsdateien für den Ruhezustand. Es hat den Vorteil, dass meine Objekte auch viel weniger überladen aussehen. Spring Data JPA bietet viele neue Funktionen, daher habe ich mich endlich gefragt, ob es sich lohnt, zu wechseln.
Egervari
3
"Spring Data" ist keine Implementierung von JPA oder so. Es wird einfach eine vorhandene JPA-Implementierung verwendet und die Bereitstellung vereinfacht. Die JPA-Implementierung erledigt immer noch die gesamte Arbeit unter dem Deckmantel
Neil Stockton

Antworten:

104

Also, spring-datamacht etwas mehr Magie, die bei komplexen Abfragen hilft. Es ist zunächst seltsam und Sie überspringen es vollständig in den Dokumenten, aber es ist wirklich mächtig und nützlich.

Dazu müssen Sie ein benutzerdefiniertes Repositoryund ein benutzerdefiniertes RepositoryImpl erstellen und Spring mitteilen, wo es zu finden ist. Hier ist ein Beispiel:

Konfigurationsklasse - Zeigen Sie auf Ihre noch benötigte XML-Konfiguration mit Anmerkungen, die auf Ihr Repositorys-Paket verweisen (es sucht *Impljetzt automatisch nach Klassen):

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml - Geben Sie an, Springwo sich Ihre Repositorys befinden. Weisen Sie außerdem Springan, nach benutzerdefinierten Repositorys mit dem CustomImplDateinamen zu suchen :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository- Hier können Sie kommentierte und nicht kommentierte Abfragemethoden einfügen. Beachten Sie, wie diese Repository-Schnittstelle die Customeine erweitert:

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom - Repository-Methoden, die komplexer sind und nicht mit einer einfachen Abfrage oder Anmerkung behandelt werden können:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- wo Sie diese Methoden tatsächlich mit einem Autowired implementieren EntityManager:

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

Erstaunlicherweise kommt dies alles zusammen und Methoden von beiden Schnittstellen (und der von Ihnen implementierten CRUD-Schnittstelle) werden angezeigt, wenn Sie Folgendes tun:

myObjectRepository.

Du wirst sehen:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

Es funktioniert wirklich. Und Sie erhalten eine Schnittstelle zum Abfragen. spring-dataist wirklich bereit für eine große Anwendung. Und je mehr Abfragen Sie in einfache oder nur Anmerkungen verschieben können, desto besser geht es Ihnen.

All dies ist auf der Spring Data Jpa-Website dokumentiert .

Viel Glück.

sbzoom
quelle
4
Dies ist eigentlich das, was ich versucht habe, und es funktioniert bis zu einem gewissen Grad. Das Problem, das ich hatte, ist, was ist, wenn Sie save () überschreiben möchten? Stellen Sie sich beispielsweise vor, Sie speichern ein Blog und möchten die damit verbundenen Tags in der save () -Methode verarbeiten / speichern, da das Einfügen in einen Dienst nicht am sinnvollsten ist. Dies ist mit Raw Hibernate einfach zu tun, aber ich sehe keinen guten Weg, um mit Spring JPA zu tun. Ich werde Ihre Antwort jedoch als richtig markieren, weil sie richtig ist. Genau das können Sie mit Spring Data JPA tun. Ich denke, ich bleibe bei Hibernate. Diese Antwort wird definitiv anderen helfen.
Egervari
8
Sie können Ihre eigenen implementieren JpaRepository-> MyJpaRepository. Sie müssen auch eine erstellen, MyJpaRepositoryFactoryBeanaber wenn Sie alles richtig eingerichtet haben, können Sie die .save () -Methode überschreiben. Hier sind die Spring Data JPA- Dokumente : static.springsource.org/spring-data/data-jpa/docs/current/… Geben Sie noch nicht auf!
sbzoom
@Picrochole Wie interpretieren Sie "untere Anwendungsebene"? Ist der Service, der DAO anruft, niedriger?
Rumid
12

Ich habe Spring Data JPA in kleinen und großen Projekten mit einfachen Abfrageanforderungen verwendet. Der Hauptvorteil besteht darin, dass die @QueryAnmerkung nicht einmal verwendet werden muss . In Spring Data gibt es nichts, was Sie daran hindert, es in großen Projekten zu verwenden, und die jüngste QueryDSLUnterstützung könnte Ihnen helfen. Dies ist ein Beispiel für die Verwendung von QueryDSL als Ziel für den Ruhezustand .

Wenn Sie komplexe Abfragen vorhersehen und sich mit Hibernate-Objekten ohne JPA wohl fühlen, könnte eine alternative Kombination darin bestehen, die einfachen Spring-Daten Repositoryneben komplexen Hibernate-basierten mit den spezifischen Methoden zu haben, die Sie möglicherweise benötigen. Es ist möglicherweise weniger umständlich, eine Hibernate-Implementierung in eine Spring Data JPA-Struktur zu verwandeln.

madth3
quelle
2
Ich denke, ich würde lieber dieselbe konsistente API für Abfragen verwenden, als sie im selben Projekt zu mischen und abzugleichen. Ich habe immer noch keine gute Lösung für das komplexe JPA-Zeug mit Frühlingsdaten gefunden, und da es im Allgemeinen einige Nitpicks mit JPA gibt, denke ich, dass ich vielleicht glücklicher bin, den Winterschlaf als mein Orm zu akzeptieren. Ich werde viele komplexe Fragen haben, und ich kann es mir nicht leisten, eine 40/60-Mischung zu haben. Es ist es mir nicht wert :(
egervari
1
Sie können Querydsl auch direkt ohne Spring Data verwenden, wodurch Sie eine einzige leistungsstarke Abfrageebene über JPA erhalten.
Timo Westkämper
4

Spring JPA bietet Ihnen viel Abstraktion vom Schreiben von SQL und sogar von etwas HQL mithilfe der Deklaration von Abfragemethoden. Spring JPA glänzt mit seiner Abfragegenerierung. Wenn Sie jedoch eine Lösung für den reinen Ruhezustand wünschen, können Sie diese nach Bedarf anpassen, da Spring JPA weiterhin auf dem Ruhezustand basiert. Weitere Informationen finden Sie in den Dokumenten unter http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html .

FOO
quelle