Jakie są główne różnice między Hibernacją a JPA Spring Data? Kiedy nie powinniśmy używać JPA Hibernacji lub Spring Data? Ponadto, kiedy szablon Spring JDBC może działać lepiej niż JPA Hibernate / Spring Data?
Jakie są główne różnice między Hibernacją a JPA Spring Data? Kiedy nie powinniśmy używać JPA Hibernacji lub Spring Data? Ponadto, kiedy szablon Spring JDBC może działać lepiej niż JPA Hibernate / Spring Data?
Odpowiedzi:
Hibernacja to implementacja JPA, natomiast Spring Data JPA to abstrakcja dostępu do danych JPA. Spring Data JPA nie może działać bez dostawcy JPA.
Spring Data oferuje rozwiązanie dla wzoru DDDRepository
lub starszych GenericDao
niestandardowych implementacji. Może również generować zapytania JPA w Twoim imieniu za pomocą konwencji nazw metod.
W Spring Data możesz używać Hibernacji, Eclipse Link lub dowolnego innego dostawcy JPA. Bardzo interesującą zaletą korzystania z Spring lub Java EE jest możliwość deklaratywnego kontrolowania granic transakcji za pomocą @Transactional
adnotacji .
Spring JDBC jest znacznie lżejszy i jest przeznaczony do natywnych zapytań, a jeśli zamierzasz korzystać tylko z JDBC samodzielnie, lepiej skorzystaj z Spring JDBC, aby poradzić sobie z gadatliwością JDBC.
Dlatego Hibernate i Spring Data uzupełniają się, a nie konkurują.
Używamy tutaj 3 różnych rzeczy:
Więc pozwala zrozumieć, jak JPA dane wiosna i wiosna + hibernacji works-
Załóżmy, że używasz aplikacji Spring + Hibernacja. Teraz musisz mieć interfejs dao i implementację, w której będziesz pisać operację crud za pomocą SessionFactory hibernacji. Powiedzmy, że piszesz klasę dao dla klasy Employee, jutro w aplikacji może być konieczne napisanie podobnej operacji dla innych podmiotów. Jest więc dużo kodu, który możemy zobaczyć tutaj.
Teraz jpa danych Spring pozwala nam definiować interfejsy dao poprzez rozszerzenie jego repozytoriów (crudrepository, jparepository), aby zapewnić implementację dao w czasie wykonywania. Nie musisz już pisać implementacji dao. W ten sposób jpa danych wiosennych ułatwia życie.
Nie zgadzam się, że SpringJPA ułatwia życie. Tak, zapewnia pewne klasy i możesz szybko zrobić prosty DAO, ale tak naprawdę to wszystko, co możesz zrobić. Jeśli chcesz zrobić coś więcej niż findById () lub zapisać, musisz przejść przez piekło:
Dlaczego własne zarządzanie transakcjami jest wadą? Ponieważ Java 1.8 pozwala na stosowanie domyślnych metod w interfejsach, transakcje oparte na adnotacjach Springa, proste nie działają.
Niestety, SpringJPA opiera się na odbiciach i czasami trzeba skierować nazwę metody lub pakiet encji do adnotacji (!). Dlatego wszelkie refaktoryzacje powodują duże awarie. Niestety @Transactional działa tylko dla podstawowego DS :( Więc jeśli masz więcej niż jedno źródło danych, pamiętaj - transakcje działają tylko dla podstawowego :)
Jakie są główne różnice między Hibernacją a JPA Spring Data?
Hibernacja jest kompatybilna z JPA, zgodna z SpringJPA Spring. Twój HibernateJPA DAO może być używany z JavaEE lub Hibernate Standalone, gdy SpringJPA może być używany w Spring - na przykład SpringBoot
Kiedy nie powinniśmy używać JPA Hibernacji lub Spring Data? Ponadto, kiedy szablon Spring JDBC może działać lepiej niż JPA Hibernate / Spring Data?
Używaj Spring JDBC tylko wtedy, gdy potrzebujesz dużo połączeń lub gdy potrzebujesz Springa z wieloma połączeniami źródła danych. Ogólnie rzecz biorąc, unikaj JPA dla połączeń.
Ale moja ogólna rada, użyj świeżego rozwiązania - Daobab ( http://www.daobab.io ). Daobab jest moim integratorem Java i dowolnego silnika JPA i wierzę, że to bardzo pomoże w twoich zadaniach :)
Spring Data
jest dodatkową biblioteką JPA
podręczną, która abstrahuje od wielu rzeczy i zapewnia magię wiosny (podobną lub nie) do dostępu do sklepu trwałości. Służy głównie do pracy z relacyjnymi bazami danych. Krótko mówiąc, pozwala zadeklarować interfejsy, które mają takie metody, findByNameOrderByAge(String name);
które zostaną przeanalizowane w czasie wykonywania i zamienione na odpowiednie JPA
zapytania.
Umieszczenie go na szczycie JPA
sprawia, że jego użycie jest kuszące:
Deweloperzy nowicjuszy, którzy go nie znają SQL
lub źle znają. To jest przepis na katastrofę, ale mogą uciec, jeśli projekt jest trywialny.
Doświadczeni inżynierowie, którzy wiedzą, co robią i chcą szybko wszystko rozwijać. To może być realna strategia (ale czytaj dalej).
Z mojego doświadczenia Spring Data
wynika, że jego magia jest zbyt duża (dotyczy to Spring
ogólnie). Zacząłem intensywnie z niego korzystać w jednym projekcie i ostatecznie trafiłem w kilka przypadków narożnych, w których nie mogłem zejść z biblioteki, i skończyło się to brzydkimi obejściami. Później przeczytałem skargi innych użytkowników i zdałem sobie sprawę, że są to typowe problemy Spring Data
. Na przykład sprawdź ten problem, który doprowadził do wielu godzin dochodzenia / przekleństw:
public TourAccommodationRate createTourAccommodationRate(
@RequestBody TourAccommodationRate tourAccommodationRate
) {
if (tourAccommodationRate.getId() != null) {
throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
}
// This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
// when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
// information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
// code creating the corresponding slim model. By detaching the entity from the persistence context we
// force the ORM to re-fetch it from the database instead of taking it from the cache
tourAccommodationRateRepository.save(tourAccommodationRate);
entityManager.detach(tourAccommodationRate);
return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
}
W końcu zszedłem na niższy poziom i zacząłem używać JDBI
- ładnej biblioteki z wystarczającą „magią”, aby ocalić cię od płyty kotłowej. Dzięki temu masz pełną kontrolę nad zapytaniami SQL i prawie nigdy nie musisz walczyć z biblioteką.
Hibernacja to implementacja „JPA”, która jest specyfikacją obiektów Java w bazie danych.
Polecam użycie wrt JPA, ponieważ możesz przełączać się między różnymi ORMS.
Kiedy używasz JDBC, musisz używać zapytań SQL, więc jeśli jesteś biegły w SQL, wybierz JDBC.
Jeśli wolisz prostotę i większą kontrolę nad zapytaniami SQL, sugeruję skorzystanie z Spring Data / Spring JDBC.
Jego duża ilość krzywej uczenia się w JPA i czasami trudne do debugowania problemów. Z drugiej strony, gdy masz pełną kontrolę nad SQL, znacznie łatwiej jest zoptymalizować zapytania i poprawić wydajność. Możesz łatwo udostępnić swój SQL DBA lub komuś, kto lepiej rozumie bazę danych.