Hibernate could not initialize proxy - no Session

hibernate, java, lazy-evaluation, lazy-initialization, persistence

Solution

userAddress = ud.getAddresses();
session.getTransaction().commit();
for(Address addr: userAddress) {

The hibernate documentation for working with lazy associations clearly calls out this kind of access as an error. You can interact with lazily associated objects only while the session is still open. That portion of the documentation also provides alternatives to access such lazily associated members of an object and we prefer to specify the fetch mode as JOIN in the criteria used, in our applications.

Problem

My code retrieves all information related to the user: ``` SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory(); Session session = sessionFactory.openSession(); UserDetails ud = null; Set<Address> userAddress = null; try { session.beginTransaction(); ud = (UserDetails) session.get(UserDetails.class, 1); userAddress = ud.getAddresses(); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { session.close(); } System.out.println(ud.getName()); for(Address addr: userAddress){ System.out.println("State " + addr.getState()); } ``` The `ud.getAddresses()` simply returns a set of `Address`es of the user. My question is: why does the `ud` object still have its value (eg, name) even though the session is already closed? `getAddresses()` is an instance variable of the `UserDetails` class. But why can't I retrieve its value but I can retrieve regular instance variables of the `UserDetails` class? `ud.getAddresses()` is an `@EmbeddedCollection`.

Original source