Eager and Lazy Fetch Types in Hibernate 5

When you load an embeding class, it may load its embedded collections either lazily or eagerly.

 

Important points about eager and lazy fetch types in Hibernate

  1. 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.

  2. 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.

  3. In eager initialization, the embedded collections are retrieved upfront.  

  4. 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

      1. FetchType.LAZY and

      2. FetchType.EAGER

    • (e.g. @ElementCollection (fetch=FetchType.EAGER)).

    • If you don’t specify the fetch parameter, the default is FetchType.LAZY.

  5. If we use an empty @ElementCollection annotation to refer to an embedded collection, the default FETCH Type will be used, which is FetchType.LAZY.

    1. 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…

    2. This is because when you call session.get for embedding class, only embedding class fields (except the embedded collection) is retrieved.

    3. 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.

    4. 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.

  6. 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.

Tags: 

Quick Notes Finder Tags

Activities (1) advanced java (1) agile (3) App Servers (6) archived notes (2) Arrays (1) Best Practices (12) Best Practices (Design) (3) Best Practices (Java) (7) Best Practices (Java EE) (1) BigData (3) Chars & Encodings (6) coding problems (2) Collections (15) contests (3) Core Java (All) (55) course plan (2) Database (12) Design patterns (8) dev tools (3) downloads (2) eclipse (9) Essentials (1) examples (14) Exception (1) Exceptions (4) Exercise (1) exercises (6) Getting Started (18) Groovy (2) hadoop (4) hibernate (77) hibernate interview questions (6) History (1) Hot book (5) http monitoring (2) Inheritance (4) intellij (1) java 8 notes (4) Java 9 (1) Java Concepts (7) Java Core (9) java ee exercises (1) java ee interview questions (2) Java Elements (16) Java Environment (1) Java Features (4) java interview points (4) java interview questions (4) javajee initiatives (1) javajee thoughts (3) Java Performance (6) Java Programmer 1 (11) Java Programmer 2 (7) Javascript Frameworks (1) Java SE Professional (1) JPA 1 - Module (6) JPA 1 - Modules (1) JSP (1) Legacy Java (1) linked list (3) maven (1) Multithreading (16) NFR (1) No SQL (1) Object Oriented (9) OCPJP (4) OCPWCD (1) OOAD (3) Operators (4) Overloading (2) Overriding (2) Overviews (1) policies (1) programming (1) Quartz Scheduler (1) Quizzes (17) RabbitMQ (1) references (2) restful web service (3) Searching (1) security (10) Servlets (8) Servlets and JSP (31) Site Usage Guidelines (1) Sorting (1) source code management (1) spring (4) spring boot (3) Spring Examples (1) Spring Features (1) spring jpa (1) Stack (1) Streams & IO (3) Strings (11) SW Developer Tools (2) testing (1) troubleshooting (1) user interface (1) vxml (8) web services (1) Web Technologies (1) Web Technology Books (1) youtube (1)