diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml
index 517d43bd0e..e84115b70a 100644
--- a/spring-data-jpa/pom.xml
+++ b/spring-data-jpa/pom.xml
@@ -17,10 +17,20 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.hibernate
+ hibernate-ehcache
+
com.h2database
h2
+
+
+ com.google.guava
+ guava
+ 21.0
+
\ No newline at end of file
diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
new file mode 100644
index 0000000000..a236cf2331
--- /dev/null
+++ b/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
@@ -0,0 +1,89 @@
+package org.baeldung.config;
+
+import com.google.common.base.Preconditions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableTransactionManagement
+@PropertySource({ "classpath:persistence-h2.properties" })
+@ComponentScan({ "org.baeldung.persistence" })
+@EnableJpaRepositories(basePackages = { "org.baeldung.persistence.dao", "org.baeldung.persistence.repository" })
+public class PersistenceJPAConfigL2Cache {
+
+ @Autowired
+ private Environment env;
+
+ public PersistenceJPAConfigL2Cache() {
+ super();
+ }
+
+ // beans
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+ final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource());
+ em.setPackagesToScan(getPackagesToScan());
+
+ final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ em.setJpaVendorAdapter(vendorAdapter);
+ em.setJpaProperties(additionalProperties());
+
+ return em;
+ }
+
+ protected String[] getPackagesToScan() {
+ return new String[] { "org.baeldung.persistence.model" };
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ final DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
+ final JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(emf);
+ return transactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ final Properties additionalProperties() {
+ final Properties hibernateProperties = new Properties();
+ hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
+ hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache"));
+ hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache"));
+ hibernateProperties.setProperty("hibernate.cache.region.factory_class", env.getProperty("hibernate.cache.region.factory_class"));
+ hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
+ return hibernateProperties;
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java
rename to spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java
diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java
similarity index 95%
rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java
rename to spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java
index eadac9a0d7..5ceb6a9f04 100644
--- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java
+++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java
@@ -55,7 +55,7 @@ public interface UserRepository extends JpaRepository {
@Query(value = "SELECT u FROM User u ORDER BY id")
Page findAllUsersWithPagination(Pageable pageable);
- @Query(value = "SELECT * FROM Users ORDER BY id \n-- #pageable\n", countQuery = "SELECT count(*) FROM Users", nativeQuery = true)
+ @Query(value = "SELECT * FROM Users ORDER BY id", countQuery = "SELECT count(*) FROM Users", nativeQuery = true)
Page findAllUsersWithPaginationNative(Pageable pageable);
@Modifying
diff --git a/spring-data-jpa/src/main/resources/persistence-h2.properties b/spring-data-jpa/src/main/resources/persistence-h2.properties
new file mode 100644
index 0000000000..716a96fde3
--- /dev/null
+++ b/spring-data-jpa/src/main/resources/persistence-h2.properties
@@ -0,0 +1,13 @@
+# jdbc.X
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
+jdbc.user=sa
+jdbc.pass=
+
+# hibernate.X
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
+hibernate.cache.use_second_level_cache=true
+hibernate.cache.use_query_cache=true
+hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java
rename to spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java