diff --git a/persistence-modules/hibernate-exceptions/pom.xml b/persistence-modules/hibernate-exceptions/pom.xml
new file mode 100644
index 0000000000..e5217e83bd
--- /dev/null
+++ b/persistence-modules/hibernate-exceptions/pom.xml
@@ -0,0 +1,39 @@
+
+
+ 4.0.0
+ hibernate-exceptions
+ 0.0.1-SNAPSHOT
+ hibernate-exceptions
+
+
+ com.baeldung
+ persistence-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.hsqldb
+ hsqldb
+ ${hsqldb.version}
+
+
+ org.hibernate
+ hibernate-core
+ ${hibernate.version}
+
+
+ javax.xml.bind
+ jaxb-api
+ ${jaxb.version}
+
+
+
+
+ 2.4.0
+ 2.3.0
+ 5.3.7.Final
+
+
+
diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/HibernateUtil.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/HibernateUtil.java
new file mode 100644
index 0000000000..b84a512fd4
--- /dev/null
+++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/HibernateUtil.java
@@ -0,0 +1,42 @@
+package com.baeldung.hibernate.exception.lazyinitialization;
+
+import java.util.Properties;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.service.ServiceRegistry;
+
+import com.baeldung.hibernate.exception.lazyinitialization.entity.Role;
+import com.baeldung.hibernate.exception.lazyinitialization.entity.User;
+
+public class HibernateUtil {
+ private static SessionFactory sessionFactory;
+
+ public static SessionFactory getSessionFactory() {
+ if (sessionFactory == null) {
+ try {
+ Configuration configuration = new Configuration();
+ Properties settings = new Properties();
+ settings.put(Environment.DRIVER, "org.hsqldb.jdbcDriver");
+ settings.put(Environment.URL, "jdbc:hsqldb:mem:userrole");
+ settings.put(Environment.USER, "sa");
+ settings.put(Environment.PASS, "");
+ settings.put(Environment.DIALECT, "org.hibernate.dialect.HSQLDialect");
+ settings.put(Environment.SHOW_SQL, "true");
+ settings.put(Environment.HBM2DDL_AUTO, "update");
+ configuration.setProperties(settings);
+ configuration.addAnnotatedClass(User.class);
+ configuration.addAnnotatedClass(Role.class);
+
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
+ .applySettings(configuration.getProperties()).build();
+ sessionFactory = configuration.buildSessionFactory(serviceRegistry);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return sessionFactory;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/entity/Role.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/entity/Role.java
new file mode 100644
index 0000000000..c15e674c52
--- /dev/null
+++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/entity/Role.java
@@ -0,0 +1,45 @@
+package com.baeldung.hibernate.exception.lazyinitialization.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "role")
+public class Role {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private int id;
+
+ @Column(name = "role_name")
+ private String roleName;
+
+ public Role() {
+
+ }
+
+ public Role(String roleName) {
+ this.roleName = roleName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getRoleName() {
+ return roleName;
+ }
+
+ public void setRoleName(String roleName) {
+ this.roleName = roleName;
+ }
+
+}
diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/entity/User.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/entity/User.java
new file mode 100644
index 0000000000..5bd7e00801
--- /dev/null
+++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/lazyinitialization/entity/User.java
@@ -0,0 +1,55 @@
+package com.baeldung.hibernate.exception.lazyinitialization.entity;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "user")
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private int id;
+
+ @Column(name = "first_name")
+ private String firstName;
+
+ @Column(name = "last_name")
+ private String lastName;
+
+ @OneToMany
+ @JoinColumn(name = "user_id")
+ private Set roles = new HashSet<>();
+
+ public User() {
+
+ }
+
+ public User(String firstName, String lastName) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public Set getRoles() {
+ return roles;
+ }
+
+ public void addRole(Role role) {
+ roles.add(role);
+ }
+
+}
diff --git a/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/lazyinitialization/HibernateNoSessionUnitTest.java b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/lazyinitialization/HibernateNoSessionUnitTest.java
new file mode 100644
index 0000000000..672c438c88
--- /dev/null
+++ b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/exception/lazyinitialization/HibernateNoSessionUnitTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.hibernate.exception.lazyinitialization;
+
+import org.hibernate.LazyInitializationException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.baeldung.hibernate.exception.lazyinitialization.entity.Role;
+import com.baeldung.hibernate.exception.lazyinitialization.entity.User;
+
+public class HibernateNoSessionUnitTest {
+
+ private static SessionFactory sessionFactory;
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @BeforeClass
+ public static void init() {
+ sessionFactory = HibernateUtil.getSessionFactory();
+ }
+
+ @Test
+ public void whenAccessUserRolesInsideSession_thenSuccess() {
+
+ User detachedUser = createUserWithRoles();
+
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+
+ User persistentUser = session.find(User.class, detachedUser.getId());
+
+ Assert.assertEquals(2, persistentUser.getRoles().size());
+
+ session.getTransaction().commit();
+ session.close();
+ }
+
+ @Test
+ public void whenAccessUserRolesOutsideSession_thenThrownException() {
+
+ User detachedUser = createUserWithRoles();
+
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+
+ User persistentUser = session.find(User.class, detachedUser.getId());
+
+ session.getTransaction().commit();
+ session.close();
+
+ thrown.expect(LazyInitializationException.class);
+ System.out.println(persistentUser.getRoles().size());
+ }
+
+ private User createUserWithRoles() {
+
+ Role admin = new Role("Admin");
+ Role dba = new Role("DBA");
+
+ User user = new User("Bob", "Smith");
+
+ user.addRole(admin);
+ user.addRole(dba);
+
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ user.getRoles().forEach(role -> session.save(role));
+ session.save(user);
+ session.getTransaction().commit();
+ session.close();
+
+ return user;
+ }
+
+ @AfterClass
+ public static void cleanUp() {
+ sessionFactory.close();
+ }
+}