Engineering Full Stack Apps with Java and JavaScript
When you load an embeding class, it may load its embedded collections either lazily or eagerly.
By default, when you load an embedding class (E.g. User or Company) using session.get,
its embedded collections (E.g. AddressList or EmployeeList) is not actually retrieved from database, but only the top level fields are retrieved.
The embedded collection is actually retrieved when you call the getter for that embedded collection.
This is called lazy initialization fetch in hibernate.
The alternative is called eager initialization fetch.
In eager initialization, the embedded collections are retrieved upfront.
We can tell hibernate whether to use lazy or eager initialization using the fetch parameter of @ElementCollection.
Two possible values for the fetch parameter are
FetchType.LAZY and
FetchType.EAGER
(e.g. @ElementCollection (fetch=FetchType.EAGER)).
If you don’t specify the fetch parameter, the default is FetchType.LAZY.
If we use an empty @ElementCollection annotation to refer to an embedded collection, the default FETCH Type will be used, which is FetchType.LAZY.
In this case, after retrieving embedding class instance, if we will close session and then try to print the values of the embedded collection, we will get an exception as:org.hibernate.LazyInitializationException: failed to lazily initialize a collection…
This is because when you call session.get for embedding class, only embedding class fields (except the embedded collection) is retrieved.
When we try to print the embedded collectiondetails after session.close, there is no session available to retrieve the address details lazily and hence it throws an exception.
If you change the @ElementCollection annotation to @ElementCollection (fetch=FetchType.LAZY), the behavior will be same and you will still get org.hibernate.LazyInitializationException. This is because FetchType.LAZY is the default.
If you change the @ElementCollection annotation to @ElementCollection (fetch=FetchType.EAGER), and execute the same program above, you will get a successful response. This is because, in EAGER initialization, you retrieve the collection during session.get for the embeding class and nothing is retrieved after session.close.