1. Java Application(Non Spring Application) + Hibernate: It's a tightly coupled Java application with Hibernate. And, in case tomorrow if it would be required to change the JPA implementation then we may need to make the changes in our java application code as well.
2. Java Application(Non Spring Application) + JPA(using JPA jar) + Hibernate: Here, ideally we should be using the method signatures provided by the JPA in our Java application. However, at runtime the JPA implementation provided by Hibernate will be used. And in case if it would be required to change the JPA implementation i.e. Hibernate then it will be required to change the Hibernate jars with some other JPA implementation jars only.
3. Spring Application(without JPA jar) + Hibernate: It's a tightly coupled Spring application with Hibernate and changing the JPA implementation may not be the matter of changing the jars only. It may be required to change the application code as well.
4. Spring Application + JPA(using JPA jar)+ Hibernate: Here, we should be using the method signatures provided by JPA. However, at runtime the JPA implementation provided by Hibernate will be used. But in case if it would be required to change the JPA implementation, then it will be required to change the hibernate jars with some other JPA implementation jars only.
5. Spring Application + Spring Data JPA(using spring-data-jpa jar): This combination can be used but will fail at runtime due to the absence of concrete JPA implementation in our classpath and hence can not be used to access the relational database.
6. Spring Application + Spring Data JPA(using spring-data-jpa jar) + Hibernate: Spring Data JPA is another layer of abstraction or wrapper on top of JPA with some additional interfaces which further reduces our coding efforts required to access any relational database. But under the hood Spring Data JPA uses the core interfaces of JPA having their implementation provided by any of its implementation like Hibernate, Toplink, EclipseLink etc.
2. Java Application(Non Spring Application) + JPA(using JPA jar) + Hibernate: Here, ideally we should be using the method signatures provided by the JPA in our Java application. However, at runtime the JPA implementation provided by Hibernate will be used. And in case if it would be required to change the JPA implementation i.e. Hibernate then it will be required to change the Hibernate jars with some other JPA implementation jars only.
3. Spring Application(without JPA jar) + Hibernate: It's a tightly coupled Spring application with Hibernate and changing the JPA implementation may not be the matter of changing the jars only. It may be required to change the application code as well.
4. Spring Application + JPA(using JPA jar)+ Hibernate: Here, we should be using the method signatures provided by JPA. However, at runtime the JPA implementation provided by Hibernate will be used. But in case if it would be required to change the JPA implementation, then it will be required to change the hibernate jars with some other JPA implementation jars only.
5. Spring Application + Spring Data JPA(using spring-data-jpa jar): This combination can be used but will fail at runtime due to the absence of concrete JPA implementation in our classpath and hence can not be used to access the relational database.
6. Spring Application + Spring Data JPA(using spring-data-jpa jar) + Hibernate: Spring Data JPA is another layer of abstraction or wrapper on top of JPA with some additional interfaces which further reduces our coding efforts required to access any relational database. But under the hood Spring Data JPA uses the core interfaces of JPA having their implementation provided by any of its implementation like Hibernate, Toplink, EclipseLink etc.