In che modo JPA Spring Data differisce da Hibernate per progetti di grandi dimensioni?


129

Non riesco a decidere se devo rimanere con Hibernate per un nuovo progetto o bagnarmi i piedi con JPA e la nuova implementazione di Spring Data.

Il framework Spring Data è destinato a grandi progetti o piccoli progetti con requisiti di query modesti?

Mentre certamente vedo il vantaggio nella riduzione del codice usando l' @Queryannotazione, cosa fai per le query dinamiche? E quando vuoi implementare un metodo save () che è abbastanza complesso?

La documentazione afferma di creare un'interfaccia e un'implementazione personalizzate implementate dal repository principale, ma cosa succede se è necessario accedere a qualsiasi super metodo sul repository crud stesso? Il repository crud implementa quello personalizzato, non viceversa. Sembra un design strano.

Sono molto incerto se questo quadro risponderà alle sfide di applicazioni complesse e di grandi dimensioni. Non ho mai incontrato molti problemi con Hibernate e sto pensando di restare fedele al vecchio affidabile piuttosto che andare con Spring Data JPA.

Cosa dovrei fare? Quali complicazioni e costi imprevisti dovrò affrontare con l'APP Spring Data?


1
Per quanto ne so, fa poca differenza. Vai con quello con cui ti senti più a tuo agio. Perché il dibattito
duffymo,

1
Sono ovviamente molto più a mio agio con Hibernate, ma se posso fare le stesse cose ed essere più produttivo, preferirei adottare gli approcci più recenti. Tuttavia, se Hibernate è ancora più potente e incontrerò molti meno problemi, allora è qualcosa che vorrei sapere.
egervari,

3
JPA è una generalizzazione di ORM che utilizza Hibernate come una delle tante implementazioni. Quali poteri stai attribuendo l'uno rispetto all'altro? JPA è uno standard, ma vedo poca differenza tra i due. Nell'interesse della piena divulgazione, dirò che non mi interessa nessuno dei due. Entrambi generano SQL per te. Preferirei scriverlo da solo. ORM non è per ogni problema e ogni utente.
duffymo,

1
Sono d'accordo. Quando si tratta solo di JPA o Hibernate, sceglierei Hibernate ogni volta. Onestamente non mi piace molto l'implementazione dell'APP da sola. Il supporto IDE in IDEA è in realtà un po 'cattivo, e si lamenterà se i mapping non sono corretti all'avvio dell'applicazione piuttosto che consentire l'esecuzione dei test unitari. Ci sono molti altri pignoli che ho con JPA. In realtà mi piacciono i vecchi file di mapping XML di Hibernate. Ha il vantaggio di rendere i miei oggetti molto meno ingombranti. Spring Data JPA offre molte nuove funzionalità, quindi finalmente mi chiedevo se valesse la pena cambiare.
egervari,

3
"Spring Data" non è un'implementazione dell'APP o altro. Prende semplicemente un'implementazione JPA esistente e semplifica ciò che gli fornisci. L'implementazione dell'APP fa ancora tutto il lavoro sotto le coperte
Neil Stockton, il

Risposte:


104

Quindi, spring-datafa qualche magia in più che aiuta con query complesse. All'inizio è strano e lo salti completamente nei documenti, ma è davvero potente e utile.

Implica la creazione di un Repository`RepositoryImpl ' personalizzato e personalizzato e di dire a Spring dove trovarlo. Ecco un esempio:

Classe di configurazione: punta alla tua configurazione xml ancora necessaria con l'annotazione che punta al pacchetto di repository (cerca *Implautomaticamente le classi ora):

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

jpa-repositories.xml - indica Springdove trovare i propri repository. Indica anche Springdi cercare repository personalizzati con il CustomImplnome del file:

<?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- qui è possibile inserire metodi di query annotati e non annotati. Nota come questa interfaccia di repository estende Customquella:

@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 - metodi di repository più complessi e che non possono essere gestiti con una query semplice o un'annotazione:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- dove si implementano effettivamente questi metodi con un autowired 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);
    }
}

Sorprendentemente, tutto questo si unisce e i metodi di entrambe le interfacce (e dell'interfaccia CRUD, implementata) vengono visualizzati tutti quando si esegue:

myObjectRepository.

Vedrai:

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

Funziona davvero. E ottieni un'interfaccia per le query. spring-dataè davvero pronto per una grande applicazione. E più query puoi inserire in semplici o annotazioni, tanto meglio sei.

Tutto questo è documentato sul sito Spring Data Jpa .

In bocca al lupo.


4
Questo è in realtà quello che ho provato, e funziona in una certa misura. Il problema che ho avuto è cosa succede se si desidera sovrascrivere save ()? Ad esempio, immagina di salvare un blog e di voler elaborare / salvare i tag ad esso associati nel metodo save () poiché metterlo in un servizio non ha più senso. Questo è facile da fare con l'ibernazione grezza, ma non vedo un buon modo di fare con l'APP Spring. Contrassegnerò la tua risposta come corretta anche se è corretta. Questo è fondamentalmente quello che puoi fare con Spring Data JPA. Penso che starò con Hibernate però. Questa risposta aiuterà sicuramente gli altri.
egervari,

8
Puoi implementare il tuo JpaRepository-> MyJpaRepository. Devi anche creare un MyJpaRepositoryFactoryBeanma se hai impostato tutto correttamente, puoi sovrascrivere il metodo .save (). Ecco i documenti JPA di Spring Data: static.springsource.org/spring-data/data-jpa/docs/current/… Non arrenderti ancora!
sbzoom,

@Picrochole come interpreti il ​​"livello inferiore dell'applicazione"? Il servizio, che chiama DAO, è di livello inferiore?
Rumido,

12

Ho usato Spring Data JPA in progetti piccoli e grandi con semplici richieste di query. Il vantaggio principale è di non dover nemmeno usare l' @Queryannotazione. In Spring Data non c'è nulla che ti impedisca di utilizzarlo in progetti di grandi dimensioni e il recente QueryDSLsupporto potrebbe aiutarti. Questo è un esempio dell'uso di QueryDSL come target di Hibernate.

Se prevedi query complesse e ti senti a tuo agio con gli oggetti Hibernate senza JPA, penso che una combinazione alternativa potrebbe essere quella di avere i semplici Spring Data Repositoryaccanto a quelli complessi basati su Hibernate con i metodi specifici di cui potresti aver bisogno. Potrebbe essere meno complicato che distorcere un'implementazione di Hibernate nella struttura dell'APP Spring Data.


2
Penso che preferirei usare la stessa API coerente per le query piuttosto che mescolare e abbinare nello stesso progetto. Non ho ancora trovato una buona soluzione per la complessa roba jpa dei dati di primavera, e dato che ci sono parecchi nitpicks con jpa che ho in generale, penso che potrei essere più felice di accettare l'ibernazione come mio orm. Avrò un sacco di domande complesse e non posso permettermi di avere una miscela 40/60. Non ne vale la pena per me :(
egervari,

1
Puoi anche utilizzare Querydsl direttamente senza Spring Data, che ti offre un unico potente livello di query in cima a JPA.
Timo Westkämper,

4

Spring JPA ti fornirà molta astrazione dalla scrittura di SQL e persino da alcuni HQL utilizzando la dichiarazione del metodo di query. Spring JPA brilla con la sua generazione di query, ma quando si desidera una soluzione puramente ibernata è possibile personalizzare secondo necessità poiché JPA spring è ancora basato su ibernazione. Controlla i documenti http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html per maggiori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.