diff --git a/persistence-modules/hibernate-annotations/README.md b/persistence-modules/hibernate-annotations/README.md
index 7d7740a069..c7efe77e22 100644
--- a/persistence-modules/hibernate-annotations/README.md
+++ b/persistence-modules/hibernate-annotations/README.md
@@ -9,3 +9,4 @@ This module contains articles about Annotations used in Hibernate.
- [Hibernate One to Many Annotation Tutorial](https://www.baeldung.com/hibernate-one-to-many)
- [Hibernate @WhereJoinTable Annotation](https://www.baeldung.com/hibernate-wherejointable)
- [Usage of the Hibernate @LazyCollection Annotation](https://www.baeldung.com/hibernate-lazycollection)
+- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable)
diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml
index 634cd64cca..ed158216fb 100644
--- a/persistence-modules/hibernate-annotations/pom.xml
+++ b/persistence-modules/hibernate-annotations/pom.xml
@@ -16,10 +16,26 @@
+
+
+ org.springframework
+ spring-context
+ ${org.springframework.version}
+
+
+ org.springframework.data
+ spring-data-jpa
+ ${org.springframework.data.version}
+
org.hibernate
hibernate-core
${hibernate-core.version}
+
+
+ org.hsqldb
+ hsqldb
+ ${hsqldb.version}
com.h2database
@@ -41,14 +57,37 @@
hibernate-spatial
${hibernate-core.version}
+
+ org.apache.tomcat
+ tomcat-dbcp
+ ${tomcat-dbcp.version}
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.springframework
+ spring-test
+ ${org.springframework.version}
+ test
+
+
+ 5.0.2.RELEASE
+ 1.10.6.RELEASE
5.4.7.Final
true
2.1.7.RELEASE
- 5.4.7.Final
1.4.200
+ 9.0.0.M26
+ 2.3.4
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/PersistenceConfig.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/PersistenceConfig.java
new file mode 100644
index 0000000000..cd46574ebf
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/PersistenceConfig.java
@@ -0,0 +1,69 @@
+package com.baeldung.hibernate.immutable;
+
+import com.google.common.base.Preconditions;
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
+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.orm.hibernate5.HibernateTransactionManager;
+import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableTransactionManagement
+@PropertySource({ "classpath:persistence-h2.properties" })
+@ComponentScan({ "com.baeldung.hibernate.immutable"})
+public class PersistenceConfig {
+
+ @Autowired
+ private Environment env;
+
+ @Bean
+ public LocalSessionFactoryBean sessionFactory() {
+ final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
+ sessionFactory.setDataSource(dataSource());
+ sessionFactory.setPackagesToScan(new String[] { "com.baeldung.hibernate.immutable" });
+ sessionFactory.setHibernateProperties(hibernateProperties());
+ return sessionFactory;
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ final BasicDataSource dataSource = new BasicDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public PlatformTransactionManager hibernateTransactionManager() {
+ final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
+ transactionManager.setSessionFactory(sessionFactory().getObject());
+ return transactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ private final Properties hibernateProperties() {
+ 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.show_sql", "false");
+ return hibernateProperties;
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java
similarity index 100%
rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java
rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java
similarity index 100%
rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java
rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java
similarity index 100%
rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java
rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java
diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/immutable.cfg.xml b/persistence-modules/hibernate-annotations/src/main/resources/immutable.cfg.xml
similarity index 100%
rename from persistence-modules/spring-hibernate-5/src/main/resources/immutable.cfg.xml
rename to persistence-modules/hibernate-annotations/src/main/resources/immutable.cfg.xml
diff --git a/persistence-modules/hibernate-annotations/src/main/resources/persistence-h2.properties b/persistence-modules/hibernate-annotations/src/main/resources/persistence-h2.properties
new file mode 100644
index 0000000000..4bc5e98f56
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/resources/persistence-h2.properties
@@ -0,0 +1,15 @@
+# jdbc.X
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
+jdbc.eventGeneratedId=sa
+jdbc.user=sa
+jdbc.pass=
+
+# hibernate.X
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=false
+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
+
diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/SpringContextTest.java
new file mode 100644
index 0000000000..4bf62dd830
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/SpringContextTest.java
@@ -0,0 +1,18 @@
+package com.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import com.baeldung.hibernate.immutable.PersistenceConfig;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class SpringContextTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
similarity index 93%
rename from persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
index 1572f23ed1..270a235ef0 100644
--- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
+++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java
@@ -52,6 +52,7 @@ public class HibernateImmutableIntegrationTest {
@Test
public void updateEvent() {
createEvent();
+ openNewSession();
Event event = (Event) session.createQuery("FROM Event WHERE title='New Event'").list().get(0);
event.setTitle("Private Event");
session.update(event);
@@ -99,6 +100,7 @@ public class HibernateImmutableIntegrationTest {
@Test
public void updateEventGenerated() {
createEventGenerated();
+ openNewSession();
EventGeneratedId eventGeneratedId = (EventGeneratedId) session.createQuery("FROM EventGeneratedId WHERE name LIKE '%John%'").list().get(0);
eventGeneratedId.setName("Mike");
@@ -121,4 +123,11 @@ public class HibernateImmutableIntegrationTest {
session.save(eventGeneratedId);
}
+ private static void openNewSession() {
+ session.getTransaction().commit();
+ session.close();
+ session = HibernateUtil.getSessionFactory().openSession();
+ session.beginTransaction();
+ }
+
}
diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md
index 124d71a21e..e2344fd585 100644
--- a/persistence-modules/spring-hibernate-5/README.md
+++ b/persistence-modules/spring-hibernate-5/README.md
@@ -10,5 +10,4 @@ This module contains articles about Hibernate 5 with Spring.
- [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache)
- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate)
- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource)
-- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable)
- [Bootstrapping Hibernate 5 with Spring](https://www.baeldung.com/hibernate-5-spring)