ChatGPT解决这个技术问题 Extra ChatGPT

What is the difference between Hibernate and Spring Data JPA

What are the main differences between Hibernate and Spring Data JPA? When should we not use Hibernate or Spring Data JPA? Also, when may Spring JDBC template perform better than Hibernate / Spring Data JPA?

@NeilStockton asking for a comparison between two technologies isn't asking for opinions.

V
Vlad Mihalcea

Hibernate is a JPA implementation, while Spring Data JPA is a JPA data access abstraction. Spring Data JPA cannot work without a JPA provider.

Spring Data offers a solution to the DDD Repository pattern or the legacy GenericDao custom implementations. It can also generate JPA queries on your behalf through method name conventions.

With Spring Data, you may use Hibernate, EclipseLink, or any other JPA provider. A very interesting benefit of using Spring or Java EE is that you can control transaction boundaries declaratively using the @Transactional annotation.

Spring JDBC is much more lightweight, and it's intended for native querying, and if you only intend to use JDBC alone, then you are better off using Spring JDBC to deal with the JDBC verbosity.

Therefore, Hibernate and Spring Data are complementary rather than competitors.


So does this mean that Spring Data JPA cannot exist of itself? That is, under the hood, it uses one of the JPA provider (like Hibernate, Eclipselink or any other JPA provider)?
I mean if I use only hibernate there is little configuration for hibernate level, If I use spring data jpa, that looks much easier than hibernate. In this sense I asked you that question.
More precisely, so far everything works fine you need only to understand the top level i.e. Spring Data JPA. With the first exception you potentially have to know the lower levels i.e. Hibernate, JDBC and the Database.
@CuriousMind No, Spring Data does not exist (work) independently. It uses Hibernate implementation by default, you can notice hibernate-core as one of child deps in spring-data-jpa
Everyone who is reading this from the MWT class: MÄÄÄHH
A
Adnan

There are 3 different things we are using here :

JPA : Java persistence api which provide specification for persisting, reading, managing data from your java object to relations in database. Hibernate: There are various provider which implement jpa. Hibernate is one of them. So we have other provider as well. But if using jpa with spring it allows you to switch to different providers in future. Spring Data JPA : This is another layer on top of jpa which spring provide to make your life easy.

So lets understand how spring data jpa and spring + hibernate works-

Spring Data JPA:

Let's say you are using spring + hibernate for your application. Now you need to have dao interface and implementation where you will be writing crud operation using SessionFactory of hibernate. Let say you are writing dao class for Employee class, tomorrow in your application you might need to write similiar crud operation for any other entity. So there is lot of boilerplate code we can see here.

Now Spring data jpa allow us to define dao interfaces by extending its repositories(crudrepository, jparepository) so it provide you dao implementation at runtime. You don't need to write dao implementation anymore.Thats how spring data jpa makes your life easy.


So what is the Spring Data JPA underlying implementation, is it hibernate?because when i use PagingAndSortingRepository, it show Hibernate logs in the console.
Spring Data JPA used Hibernate implementation by default.. If you see the transitive dependencies of spring-boot-starter-data-jpa, you can see hibernate-core there
C
Cody Gray

I disagree SpringJPA makes live easy. Yes, it provides some classes and you can make some simple DAO fast, but in fact, it's all you can do. If you want to do something more than findById() or save, you must go through hell:

no EntityManager access in org.springframework.data.repository classes (this is basic JPA class!)

own transaction management (hibernate transactions disallowed)

huge problems with more than one datasources configuration

no datasource pooling (HikariCP must be in use as third party library)

Why own transaction management is an disadvantage? Since Java 1.8 allows default methods into interfaces, Spring annotation based transactions, simple doesn't work.

Unfortunately, SpringJPA is based on reflections, and sometimes you need to point a method name or entity package into annotations (!). That's why any refactoring makes big crash. Sadly, @Transactional works for primary DS only :( So, if you have more than one DataSources, remember - transactions works just for primary one :)

What are the main differences between Hibernate and Spring Data JPA?

Hibernate is JPA compatibile, SpringJPA Spring compatibile. Your HibernateJPA DAO can be used with JavaEE or Hibernate Standalone, when SpringJPA can be used within Spring - SpringBoot for example

When should we not use Hibernate or Spring Data JPA? Also, when may Spring JDBC template perform better than Hibernate / Spring Data JPA?

Use Spring JDBC only when you need to use much Joins or when you need to use Spring having multiple datasource connections. Generally, avoid JPA for Joins.

But my general advice, use fresh solution—Daobab (http://www.daobab.io). Daobab is my Java and any JPA engine integrator, and I believe it will help much in your tasks :)


Daobab, really? If you don't like jpql's like of type safety (I don't), JPA has a type safe criteria API... Standard JPA is better than that poor alternative.
r
raiks

Spring Data is a convenience library on top of JPA that abstracts away many things and brings Spring magic (like it or not) to the persistence store access. It is primarily used for working with relational databases. In short, it allows you to declare interfaces that have methods like findByNameOrderByAge(String name); that will be parsed in runtime and converted into appropriate JPA queries.

Its placement atop of JPA makes its use tempting for:

Rookie developers who don't know SQL or know it badly. This is a recipe for disaster but they can get away with it if the project is trivial. Experienced engineers who know what they do and want to spindle up things fast. This might be a viable strategy (but read further).

From my experience with Spring Data, its magic is too much (this is applicable to Spring in general). I started to use it heavily in one project and eventually hit several corner cases where I couldn't get the library out of my way and ended up with ugly workarounds. Later I read other users' complaints and realized that these issues are typical for Spring Data. For example, check this issue that led to hours of investigation/swearing:

 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());
    }

I ended up going lower level and started using JDBI - a nice library with just enough "magic" to save you from the boilerplate. With it, you have complete control over SQL queries and almost never have to fight the library.


this is a good answer but if you could list down the corner cases and detail it further it will be very helpful. It will become a Great Answer. Thanks
Well, it's not that easy to recall those given that I haven't worked with Spring Data for quite a while - I will have to go over the old code and will add more comments. However, one of the annoyances straight from my head - in JPA very often objects have to reference each other (e.g. for cascading operations). This causes a Stack Overflow error (due to circular references) when Spring tries to serialize them forcing you into ugly fiddling/workarounds. This issue is tangential to Spring Data though because it's a JPA issue. However, since JPA is underlying Spring Data you get it "for free".
Edited the post and added one more example.
G
GPopat

If you prefer simplicity and more control on SQL queries then I would suggest going with Spring Data/ Spring JDBC.

Its good amount of learning curve in JPA and sometimes difficult to debug issues. On the other hand, while you have full control over SQL, it becomes much easier to optimize query and improve performance. You can easily share your SQL with DBA or someone who has a better understanding of Database.


M
Muhammad Waqas Dilawar

Hibernate is implementation of "JPA" which is a specification for Java objects in Database.

I would recommend to use w.r.t JPA as you can switch between different ORMS.

When you use JDBC then you need to use SQL Queries, so if you are proficient in SQL then go for JDBC.


What is w.r.t.?
with respect to