What is the relationship between DTO and lazy-loading in Hibernate












2















I know what is DTO: An object that carries data between processes in order to reduce the number of method calls.
and I know what is lazy-loading in hibernate.



I read this sentences in "Full Stack Development with JHipster" book :
JHipster uses DTO (Data Transfer Object) and VM (View Model) on the server side. DTOs are for transferring data from the service layer to and from the resource layer. They break the Hibernate transactions and avoids further lazy loading from being triggered by the resource layer.



I don't understand the relationship between DTO and lazy loading.










share|improve this question





























    2















    I know what is DTO: An object that carries data between processes in order to reduce the number of method calls.
    and I know what is lazy-loading in hibernate.



    I read this sentences in "Full Stack Development with JHipster" book :
    JHipster uses DTO (Data Transfer Object) and VM (View Model) on the server side. DTOs are for transferring data from the service layer to and from the resource layer. They break the Hibernate transactions and avoids further lazy loading from being triggered by the resource layer.



    I don't understand the relationship between DTO and lazy loading.










    share|improve this question



























      2












      2








      2








      I know what is DTO: An object that carries data between processes in order to reduce the number of method calls.
      and I know what is lazy-loading in hibernate.



      I read this sentences in "Full Stack Development with JHipster" book :
      JHipster uses DTO (Data Transfer Object) and VM (View Model) on the server side. DTOs are for transferring data from the service layer to and from the resource layer. They break the Hibernate transactions and avoids further lazy loading from being triggered by the resource layer.



      I don't understand the relationship between DTO and lazy loading.










      share|improve this question
















      I know what is DTO: An object that carries data between processes in order to reduce the number of method calls.
      and I know what is lazy-loading in hibernate.



      I read this sentences in "Full Stack Development with JHipster" book :
      JHipster uses DTO (Data Transfer Object) and VM (View Model) on the server side. DTOs are for transferring data from the service layer to and from the resource layer. They break the Hibernate transactions and avoids further lazy loading from being triggered by the resource layer.



      I don't understand the relationship between DTO and lazy loading.







      java hibernate lazy-loading jhipster dto






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Dec 6 '18 at 13:28









      Vlad Mihalcea

      58.5k13164467




      58.5k13164467










      asked Nov 22 '18 at 10:56









      sajjad jafarisajjad jafari

      132




      132
























          3 Answers
          3






          active

          oldest

          votes


















          3














          If you pass Hibernate managed persistent entities to the resource layer with LazyLoading enabled, the resource layer will invoke get-methods in order to read their properties some of which are possibly not initialized at that time. Hibernate will then lazily load the data of that particular property from the persisntet store, sending an SQL statement (possibly each time starting and committing a new transaction) and waiting for response which is quite slow. If this happens hundred of times, each time having to initialize another property, each time triggering a lazy load, the user has to wait...



          If you prepare a DTO in your service layer, containing all the data relevant to the resource layer, read access to that DTO is highly efficient without the risk of hitting the database for any get-method invokation as everything relevant is in memory already. No subsequent lazy load will be triggered.






          share|improve this answer































            2














            Lazy loading is for entities, not DTOs.



            A JPA entity can be represented as a POJO or a Proxy.



            As I explained in this article, using EntityMnager.find gives you a POJO:



            Post post = entityManager.find(Post.class, postId);


            While the EtityManager.getReference method gives you a Proxy:



            Post post = entityManager.getReference(Post.class, postId);


            The POJO has its basic properties initialized because a SELECT statement was executed to fetch the entity. The Proxy does not hit the database upon creation. Only the id is set based on the provided entity identifier. Only you access the Proxy properties, a SELECT statement will be executed.



            Proxies are also used for collections (e.g. @OneToMany or @ManyToMany) which are using the FetchType.LAZY strategy by default. Once you access the LAZY collection, a SELECT statement will be executed to fetch the associated collection.



            Now, a DTO is based on a projection, hence a SELECT statement is executed prior to populating the DTO. For this purpose, you can say that the DTO is eagerly loaded every time.



            DTOs are much more efficient than entities for read-only projections because you load just the table columns that you explicitly requested. For more details about the best way to use DTOs with JPA and Hibernate, check out this article.






            share|improve this answer































              1














              In Simple terms: If you call getter of a lazy loading marked field, Hibernate will make a db query for that data.



              This is one of the reasons you should not return Entities as backend response... any JSON conversion(Serialization)/getter call will trigger unwanted loading of the data.



              whereas a DTO is made specifically to transfer data as per use and you create DTO from these Entities (Multiple DTO can be created from one Entity) and pick only required data fields



              Eg.
              User entity: has user details and list of friends
              UserDetailsDTO: would only require the details and dont need 1000's of friends mapped to the user... and their friends...
              UserFriendsDTO: we can selectively get the friends names or ids for this DTO






              share|improve this answer























                Your Answer






                StackExchange.ifUsing("editor", function () {
                StackExchange.using("externalEditor", function () {
                StackExchange.using("snippets", function () {
                StackExchange.snippets.init();
                });
                });
                }, "code-snippets");

                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "1"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53429410%2fwhat-is-the-relationship-between-dto-and-lazy-loading-in-hibernate%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                3














                If you pass Hibernate managed persistent entities to the resource layer with LazyLoading enabled, the resource layer will invoke get-methods in order to read their properties some of which are possibly not initialized at that time. Hibernate will then lazily load the data of that particular property from the persisntet store, sending an SQL statement (possibly each time starting and committing a new transaction) and waiting for response which is quite slow. If this happens hundred of times, each time having to initialize another property, each time triggering a lazy load, the user has to wait...



                If you prepare a DTO in your service layer, containing all the data relevant to the resource layer, read access to that DTO is highly efficient without the risk of hitting the database for any get-method invokation as everything relevant is in memory already. No subsequent lazy load will be triggered.






                share|improve this answer




























                  3














                  If you pass Hibernate managed persistent entities to the resource layer with LazyLoading enabled, the resource layer will invoke get-methods in order to read their properties some of which are possibly not initialized at that time. Hibernate will then lazily load the data of that particular property from the persisntet store, sending an SQL statement (possibly each time starting and committing a new transaction) and waiting for response which is quite slow. If this happens hundred of times, each time having to initialize another property, each time triggering a lazy load, the user has to wait...



                  If you prepare a DTO in your service layer, containing all the data relevant to the resource layer, read access to that DTO is highly efficient without the risk of hitting the database for any get-method invokation as everything relevant is in memory already. No subsequent lazy load will be triggered.






                  share|improve this answer


























                    3












                    3








                    3







                    If you pass Hibernate managed persistent entities to the resource layer with LazyLoading enabled, the resource layer will invoke get-methods in order to read their properties some of which are possibly not initialized at that time. Hibernate will then lazily load the data of that particular property from the persisntet store, sending an SQL statement (possibly each time starting and committing a new transaction) and waiting for response which is quite slow. If this happens hundred of times, each time having to initialize another property, each time triggering a lazy load, the user has to wait...



                    If you prepare a DTO in your service layer, containing all the data relevant to the resource layer, read access to that DTO is highly efficient without the risk of hitting the database for any get-method invokation as everything relevant is in memory already. No subsequent lazy load will be triggered.






                    share|improve this answer













                    If you pass Hibernate managed persistent entities to the resource layer with LazyLoading enabled, the resource layer will invoke get-methods in order to read their properties some of which are possibly not initialized at that time. Hibernate will then lazily load the data of that particular property from the persisntet store, sending an SQL statement (possibly each time starting and committing a new transaction) and waiting for response which is quite slow. If this happens hundred of times, each time having to initialize another property, each time triggering a lazy load, the user has to wait...



                    If you prepare a DTO in your service layer, containing all the data relevant to the resource layer, read access to that DTO is highly efficient without the risk of hitting the database for any get-method invokation as everything relevant is in memory already. No subsequent lazy load will be triggered.







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 22 '18 at 12:31









                    SelaronSelaron

                    2,48611423




                    2,48611423

























                        2














                        Lazy loading is for entities, not DTOs.



                        A JPA entity can be represented as a POJO or a Proxy.



                        As I explained in this article, using EntityMnager.find gives you a POJO:



                        Post post = entityManager.find(Post.class, postId);


                        While the EtityManager.getReference method gives you a Proxy:



                        Post post = entityManager.getReference(Post.class, postId);


                        The POJO has its basic properties initialized because a SELECT statement was executed to fetch the entity. The Proxy does not hit the database upon creation. Only the id is set based on the provided entity identifier. Only you access the Proxy properties, a SELECT statement will be executed.



                        Proxies are also used for collections (e.g. @OneToMany or @ManyToMany) which are using the FetchType.LAZY strategy by default. Once you access the LAZY collection, a SELECT statement will be executed to fetch the associated collection.



                        Now, a DTO is based on a projection, hence a SELECT statement is executed prior to populating the DTO. For this purpose, you can say that the DTO is eagerly loaded every time.



                        DTOs are much more efficient than entities for read-only projections because you load just the table columns that you explicitly requested. For more details about the best way to use DTOs with JPA and Hibernate, check out this article.






                        share|improve this answer




























                          2














                          Lazy loading is for entities, not DTOs.



                          A JPA entity can be represented as a POJO or a Proxy.



                          As I explained in this article, using EntityMnager.find gives you a POJO:



                          Post post = entityManager.find(Post.class, postId);


                          While the EtityManager.getReference method gives you a Proxy:



                          Post post = entityManager.getReference(Post.class, postId);


                          The POJO has its basic properties initialized because a SELECT statement was executed to fetch the entity. The Proxy does not hit the database upon creation. Only the id is set based on the provided entity identifier. Only you access the Proxy properties, a SELECT statement will be executed.



                          Proxies are also used for collections (e.g. @OneToMany or @ManyToMany) which are using the FetchType.LAZY strategy by default. Once you access the LAZY collection, a SELECT statement will be executed to fetch the associated collection.



                          Now, a DTO is based on a projection, hence a SELECT statement is executed prior to populating the DTO. For this purpose, you can say that the DTO is eagerly loaded every time.



                          DTOs are much more efficient than entities for read-only projections because you load just the table columns that you explicitly requested. For more details about the best way to use DTOs with JPA and Hibernate, check out this article.






                          share|improve this answer


























                            2












                            2








                            2







                            Lazy loading is for entities, not DTOs.



                            A JPA entity can be represented as a POJO or a Proxy.



                            As I explained in this article, using EntityMnager.find gives you a POJO:



                            Post post = entityManager.find(Post.class, postId);


                            While the EtityManager.getReference method gives you a Proxy:



                            Post post = entityManager.getReference(Post.class, postId);


                            The POJO has its basic properties initialized because a SELECT statement was executed to fetch the entity. The Proxy does not hit the database upon creation. Only the id is set based on the provided entity identifier. Only you access the Proxy properties, a SELECT statement will be executed.



                            Proxies are also used for collections (e.g. @OneToMany or @ManyToMany) which are using the FetchType.LAZY strategy by default. Once you access the LAZY collection, a SELECT statement will be executed to fetch the associated collection.



                            Now, a DTO is based on a projection, hence a SELECT statement is executed prior to populating the DTO. For this purpose, you can say that the DTO is eagerly loaded every time.



                            DTOs are much more efficient than entities for read-only projections because you load just the table columns that you explicitly requested. For more details about the best way to use DTOs with JPA and Hibernate, check out this article.






                            share|improve this answer













                            Lazy loading is for entities, not DTOs.



                            A JPA entity can be represented as a POJO or a Proxy.



                            As I explained in this article, using EntityMnager.find gives you a POJO:



                            Post post = entityManager.find(Post.class, postId);


                            While the EtityManager.getReference method gives you a Proxy:



                            Post post = entityManager.getReference(Post.class, postId);


                            The POJO has its basic properties initialized because a SELECT statement was executed to fetch the entity. The Proxy does not hit the database upon creation. Only the id is set based on the provided entity identifier. Only you access the Proxy properties, a SELECT statement will be executed.



                            Proxies are also used for collections (e.g. @OneToMany or @ManyToMany) which are using the FetchType.LAZY strategy by default. Once you access the LAZY collection, a SELECT statement will be executed to fetch the associated collection.



                            Now, a DTO is based on a projection, hence a SELECT statement is executed prior to populating the DTO. For this purpose, you can say that the DTO is eagerly loaded every time.



                            DTOs are much more efficient than entities for read-only projections because you load just the table columns that you explicitly requested. For more details about the best way to use DTOs with JPA and Hibernate, check out this article.







                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Nov 28 '18 at 12:25









                            Vlad MihalceaVlad Mihalcea

                            58.5k13164467




                            58.5k13164467























                                1














                                In Simple terms: If you call getter of a lazy loading marked field, Hibernate will make a db query for that data.



                                This is one of the reasons you should not return Entities as backend response... any JSON conversion(Serialization)/getter call will trigger unwanted loading of the data.



                                whereas a DTO is made specifically to transfer data as per use and you create DTO from these Entities (Multiple DTO can be created from one Entity) and pick only required data fields



                                Eg.
                                User entity: has user details and list of friends
                                UserDetailsDTO: would only require the details and dont need 1000's of friends mapped to the user... and their friends...
                                UserFriendsDTO: we can selectively get the friends names or ids for this DTO






                                share|improve this answer




























                                  1














                                  In Simple terms: If you call getter of a lazy loading marked field, Hibernate will make a db query for that data.



                                  This is one of the reasons you should not return Entities as backend response... any JSON conversion(Serialization)/getter call will trigger unwanted loading of the data.



                                  whereas a DTO is made specifically to transfer data as per use and you create DTO from these Entities (Multiple DTO can be created from one Entity) and pick only required data fields



                                  Eg.
                                  User entity: has user details and list of friends
                                  UserDetailsDTO: would only require the details and dont need 1000's of friends mapped to the user... and their friends...
                                  UserFriendsDTO: we can selectively get the friends names or ids for this DTO






                                  share|improve this answer


























                                    1












                                    1








                                    1







                                    In Simple terms: If you call getter of a lazy loading marked field, Hibernate will make a db query for that data.



                                    This is one of the reasons you should not return Entities as backend response... any JSON conversion(Serialization)/getter call will trigger unwanted loading of the data.



                                    whereas a DTO is made specifically to transfer data as per use and you create DTO from these Entities (Multiple DTO can be created from one Entity) and pick only required data fields



                                    Eg.
                                    User entity: has user details and list of friends
                                    UserDetailsDTO: would only require the details and dont need 1000's of friends mapped to the user... and their friends...
                                    UserFriendsDTO: we can selectively get the friends names or ids for this DTO






                                    share|improve this answer













                                    In Simple terms: If you call getter of a lazy loading marked field, Hibernate will make a db query for that data.



                                    This is one of the reasons you should not return Entities as backend response... any JSON conversion(Serialization)/getter call will trigger unwanted loading of the data.



                                    whereas a DTO is made specifically to transfer data as per use and you create DTO from these Entities (Multiple DTO can be created from one Entity) and pick only required data fields



                                    Eg.
                                    User entity: has user details and list of friends
                                    UserDetailsDTO: would only require the details and dont need 1000's of friends mapped to the user... and their friends...
                                    UserFriendsDTO: we can selectively get the friends names or ids for this DTO







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Nov 22 '18 at 14:08









                                    deependraxdeependrax

                                    567




                                    567






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53429410%2fwhat-is-the-relationship-between-dto-and-lazy-loading-in-hibernate%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

                                        Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

                                        A Topological Invariant for $pi_3(U(n))$