2012-10-08 14 views
108

Ciężko mi się zastanowić, czy powinienem pozostawić Hibernate do nowego projektu, czy też zmoczyć stopy dzięki JPA i nowej implementacji Spring Data.Czym różni się Spring Data JPA od Hibernate w przypadku dużych projektów?

Czy struktura danych wiosennych jest przeznaczona dla dużych projektów lub małych projektów o niewielkich wymaganiach dotyczących zapytań?

Podczas gdy na pewno widzę przewagę w redukcji kodu za pomocą adnotacji @Query, co robisz w przypadku zapytań dynamicznych? A co, gdy chcesz zaimplementować metodę save(), która jest dość złożona?

Dokumentacja mówi, że należy wprowadzić niestandardowy interfejs i implementację, którą ma wdrożyć główne repozytorium, ale co zrobić, jeśli potrzebujesz dostępu do jakichkolwiek super metod w samym repozytorium? Repozytorium crud implementuje niestandardowe - nie odwrotnie. Wygląda jak dziwny projekt.

Jestem bardzo niepewny, czy ramy te sprostają wyzwaniom złożonych i dużych aplikacji. Nigdy nie natknąłem się na wiele problemów z Hibernate i rozważam trzymanie się starych dobrych, niezawodnych rozwiązań, zamiast korzystać z Spring Data JPA.

Co należy zrobić? Jakie nieprzewidziane komplikacje i koszty napotkają, jeśli pójdę z Spring Data JPA?

+1

O ile mi wiadomo, nie ma to większego znaczenia. Idź z tym, z którym jesteś bardziej komfortowy. Dlaczego debata? – duffymo

+1

Jestem oczywiście o wiele bardziej komfortowy w Hibernate, ale jeśli mogę zrobić to samo i być bardziej produktywnym, wolałbym przyjąć nowsze podejścia. Jednakże, jeśli Hibernate jest jeszcze potężniejszy i napotkam o wiele mniej problemów, to jest coś, o czym chciałbym wiedzieć. – egervari

+2

JPA to uogólnienie ORM, które wykorzystuje Hibernate jako jedną z wielu implementacji. Jakie moce przypisujesz sobie nawzajem? JPA jest standardem, ale widzę niewielką różnicę między tymi dwoma. W interesie pełnego ujawnienia, powiem, że nie dbam o żadną z nich. Oba generują SQL dla ciebie. Wolałbym to napisać sam. ORM nie jest dla każdego problemu i każdego użytkownika. – duffymo

Odpowiedz

91

Więc, spring-data robi dodatkową magię, która pomaga w złożonych zapytaniach. Na początku jest to dziwne i całkowicie pominąć to w dokumentach, ale jest naprawdę potężny i użyteczny.

Obejmuje tworzenie niestandardowego Repository i niestandardowego `RepositoryImpl 'oraz informowanie Spring, gdzie ją znaleźć. Oto przykład:

klasa

Konfiguracja - punkt do wciąż potrzebne xml config z adnotacja, wskazujący na opakowaniu repozytoriów (automatycznie wyszukuje *Impl klas teraz):

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

JPA-repozytoria .xml - powiedz Spring gdzie znaleźć swoje repozytoria. Również powiedzieć Spring szukać niestandardowych repozytorium o nazwie CustomImpl pliku:

<?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 - jest to miejsce gdzie można umieścić adnotacje i nieopisanych metody zapytań.Zwróćmy uwagę, że interfejs repozytorium rozszerza Custom pierwszy:

@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 - metody repozytorium, które są bardziej skomplikowane i może być obsługiwane w prosty zapytania lub adnotacją:

public interface MyObjectRepositoryCustom { 

    List<MyObject> findByNameWithWeirdOrdering(String name); 
} 

MyObjectRepositoryCustomImpl - w przypadku rzeczywistego wdrożenia tych metod za pomocą autowyredu 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); 
    } 
} 

dziwo, to wszystko sprowadza się razem i metody z obu interfejsów (i interfejsu CRUD, wdrożyć) wszystko pokazać się, gdy robisz:

myObjectRepository. 

Zobaczysz:

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

To naprawdę działa. I masz jeden interfejs do wysyłania zapytań. spring-data jest naprawdę gotowy na dużą aplikację. A im więcej pytań możesz wepchnąć w prostą lub adnotację, tym lepiej.

Wszystko to jest udokumentowane pod numerem Spring Data Jpa site.

Powodzenia.

+4

To jest to, co próbowałem i działa do pewnego stopnia. jest to, co chcesz zastąpić save()? Na przykład wyobraź sobie, że zapisujesz bloga i chcesz przetwarzać/zapisywać znaczniki powiązane z nim w metodzie save(), ponieważ umieszczenie go w usłudze nie powoduje Najwyraźniej jest to łatwe do zrobienia z surowym Hibernate, ale nie widzę dobrego sposobu na Spring JPA. Zaznaczę twoją odpowiedź jako poprawną, chociaż jest prawidłowa. Data JPA: Myślę, że pozostanę przy Hibernate, ta odpowiedź z pewnością pomoże innym – egervari

+8

Możesz zaimplementować własny 'JpaRepository' ->' MyJpaRepository' Musisz także utworzyć 'MyJpaRepositoryFactoryBean' ale jeśli ustawisz to wszystko poprawnie, możesz przesłonić .sa Metoda ve(). Oto Spring Data JPA Docs: http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories Nie udzielaj jeszcze tylko! – sbzoom

+0

@ Picrochole jak interpretujesz "niższy poziom aplikacji"? Czy usługa, która nazywa DAO niższym poziomem? – Rumid

9

Użyłem Spring Data JPA w małych i dużych projektach z prostymi żądaniami zapytań. Główną zaletą jest to, że nawet nie trzeba używać adnotacji @Query. W Spring Data nie ma nic, co uniemożliwiłoby ci korzystanie z niego w dużych projektach, a ostatnia pomoc QueryDSL może ci pomóc. This is an example z używania QueryDSL do kierowania na Hibernate.

Jeśli będziesz przewidywał skomplikowane zapytania i czujesz się komfortowo przy korzystaniu z obiektów Hibernuj bez JPA, myślę, że alternatywną kombinacją może być posiadanie prostego Spring Data Repository s obok złożonych baz Hibernate z konkretnymi metodami, których możesz potrzebować. Może to być mniej kłopotliwe niż przekręcenie implementacji Hibernate w strukturę Spring Data JPA.

+2

Myślę, że wolałbym raczej używać tego samego spójnego API dla zapytań niż mieszania i dopasowywania w tym samym projekcie. Nadal nie znalazłem dobrego rozwiązania dla złożonych danych jpa na temat danych źródłowych, a ponieważ istnieje całkiem sporo wyrażeń z jpą, które ogólnie mam, myślę, że być może jestem szczęśliwszy, aby zaakceptować hibernację jako mój orm. Będę miał wiele skomplikowanych pytań i nie mogę sobie pozwolić na mieszankę 40/60. Nie jest to dla mnie warte :( – egervari

+1

Możesz również użyć Querydsl bezpośrednio bez Spring Data, co daje pojedynczą potężną warstwę zapytania na WZP. –

2

Wiosenny WZP zapewni Ci wiele abstrakcji od pisania SQL, a nawet niektórych HQL przy użyciu deklaracji metody zapytania. Spring JPA świeci z generowaniem zapytań, ale gdy chcesz mieć rozwiązanie wyłącznie hibernujące, możesz dostosować je w miarę potrzeb, ponieważ wiosna JPA nadal opiera się na hibernacji. Sprawdź dokumentację http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html, aby uzyskać więcej informacji.

Powiązane problemy