Paul is right, but I'd like to add a little more to the explanation:
With enhancement (CGLIB) you can lazy load properties of complex, concrete or abstract types (as well as interfaces). Without enhancement (CGLIB), you can only lazy load properties of interface types. The reason is that Java's Dynamic Proxy facility only supports dynamic implementation of interfaces. It does not support dynamic class extension -- which really sucks and for which there is NO good reason (as proven by CGLIB). So that's the story. I hope it helps. Clinton On 1/4/07, MCCORMICK, Paul <[EMAIL PROTECTED]> wrote:
Setting lazyLoadingEnabled to true will allow the lazy loading 1 to many relationships. You don't have any 1 to many relationships in your code below. Setting enhancementEnabled to true will allow the lazy loading of 1 to 1 relationships. ------------------------------ *From:* Kuntz, Tim [mailto:[EMAIL PROTECTED] *Sent:* Friday, 5 January 2007 11:24 AM *To:* user-java@ibatis.apache.org *Subject:* iBatis Book - Lazy Loading Description The new iBatis book describes lazy-loading as follows (pg 131). "To use lazy loading, we need to edit the SqlMapConfig.xml file to enable it by changing the lazyLoadingEnabled attribute to true in the <setting> element. If you want to use the cglib enhanced version of lazy loading, you will want to download it, add it to your application's classpath, and change the enhancementEnabled attribute of the <setting> element to true as well." After setting up a sample similar to that in the book, I noticed that lazy-loading only appears to work correctly if BOTH lazyLoadingEnabled and enhancementEnabled are set to true. Running the following code executes the selects as the objects are requested. person = sqlMapper.queryForObject("Person.selectPerson"); // runs select ... from person person.getAddress(); // runs select .. from address person.getAddress().getState(); // runs select .. from state Setting enhancementEnabled to false causes all of the select statements to execute initially. Changing lazyLoadingEnabled to false doesn't change the behavior. person = sqlMapper.queryForObject("Person.selectPerson"); // runs all 3 select statements person.getAddress(); person.getAddress().getState(); Is this correct behavior? If so, when would I benefit from lazyLoadingEnabled = "true"? I'm using iBatis version 2.3.0.677 Thanks, Tim "DISCLAIMER: This email, including any attachments, is intended only for use by the addressee(s) and may contain confidential and/or personal information and may also be the subject of legal privilege. If you are not the intended recipient, you must not disclose or use the information contained in it. In this case, please let me know by return email, delete the message permanently from your system and destroy any copies. Before you take any action based upon advice and/or information contained in this email you should carefully consider the advice and information and consider obtaining relevant independent advice.