That might have been a bug just recently fixed. Try out the trunk. The lazy loader was heavily optimized for both performance and memory usage.
Clinton 2010/2/18 Ing. Jan Novotný <novotn...@gmail.com> > Thank you for answer. I understand now why all data were loaded at the > first touch to the object and not at time when particular property is > needed. But I still don't undestand why iBatis make two same select queries > to the database (see the log please) - this might hit a performance in some > cases. I still don't see the point. > Thanks. > > Jan > > 2010/2/18 Clinton Begin <clinton.be...@gmail.com> > >> This was a topic of much debate. It does that to allow internal >> references to private fields. But some people don't like that behavior, so >> in the next release (or in trunk if you want to check it out and build it), >> there's a configuration switch. The docs are already updated, so look for >> the aggressiveLazyLoad setting. >> >> >> Clinton >> >> 2010/2/18 Ing. Jan Novotný <novotn...@gmail.com> >> >>> Hello again, >>> >>> >>> I've found that for lazily loaded objects triggers multiple >>> unnecessary selects and are executed all at load time not at the time, when >>> I touch the property. I use 3-beta-9 and my settings are following: >>> >>> <settings> >>> <setting name="cacheEnabled" value="true"/> >>> <setting name="lazyLoadingEnabled" value="true"/> >>> <setting name="multipleResultSetsEnabled" value="true"/> >>> <setting name="useColumnLabel" value="true"/> >>> <setting name="useGeneratedKeys" value="false"/> >>> </settings> >>> >>> <resultMap id="thinProductLazyLoaded" type="product"> >>> <id property="id" column="id"/> >>> <result property="name" column="name"/> >>> <association property="group" column="idGroup" javaType="group" >>> >>> select="cz.novoj.ibatis.ProductGroupMapper.getGroupById"/> >>> </resultMap> >>> >>> <select id="getLazyProductById" parameterType="int" >>> resultMap="thinProductLazyLoaded"> >>> select * from product where id = #{id} >>> </select> >>> >>> <select id="getGroupById" parameterType="int" resultType="group"> >>> select * from productGroup where id = #{id} >>> </select> >>> >>> Test: >>> >>> @Test >>> public void testGetLazyProductById() throws Exception { >>> Product product = productMapper.getLazyProductById(1); >>> assertNotNull(product); >>> System.out.println("#1"); >>> assertEquals(1, (int)product.getId()); >>> System.out.println("#2"); >>> assertEquals("Lenovo ThinkCentre 250GB Serial ATA Hard Disk >>> Drive", product.getName()); >>> assertNotNull(product.getGroup()); >>> System.out.println("#3"); >>> assertEquals("HDD", product.getGroup().getName()); >>> assertEquals("HARDWARE", product.getGroup().getGroupType()); >>> assertNull(product.getTags()); >>> } >>> >>> Output: >>> >>> DEBUG [main][2010-02-18 14:42:34,140][java.sql.Connection]: ooo >>> Connection Opened >>> DEBUG [main][2010-02-18 14:42:34,234][java.sql.PreparedStatement]: ==> >>> Executing: select * from product where id = ? >>> DEBUG [main][2010-02-18 14:42:34,234][java.sql.PreparedStatement]: ==> >>> Parameters: 1(Integer) >>> DEBUG [main][2010-02-18 14:42:34,250][java.sql.ResultSet]: <== >>> Columns: ID, NAME, IDGROUP >>> DEBUG [main][2010-02-18 14:42:34,250][java.sql.ResultSet]: <== >>> Row: 1, Lenovo ThinkCentre 250GB Serial ATA Hard Disk Drive, 1 >>> DEBUG [main][2010-02-18 14:42:34,359][java.sql.Connection]: xxx >>> Connection Closed >>> #1 >>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.Connection]: ooo >>> Connection Opened >>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.PreparedStatement]: ==> >>> Executing: select * from productGroup where id = ? >>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.PreparedStatement]: ==> >>> Parameters: 1(Integer) >>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.ResultSet]: <== >>> Columns: ID, NAME, GROUPTYPE >>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.ResultSet]: <== >>> Row: 1, HDD, HARDWARE >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.Connection]: xxx >>> Connection Closed >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.Connection]: ooo >>> Connection Opened >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.PreparedStatement]: ==> >>> Executing: select * from productGroup where id = ? >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.PreparedStatement]: ==> >>> Parameters: 1(Integer) >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.ResultSet]: <== >>> Columns: ID, NAME, GROUPTYPE >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.ResultSet]: <== >>> Row: 1, HDD, HARDWARE >>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.Connection]: xxx >>> Connection Closed >>> #2 >>> #3 >>> >>> Could someone explain how lazy really loading works? As I see, the >>> lazy loading paradigm has changed a lot since iBatis 2.x >>> >>> Jan >>> >>> -- >>> -------------------------------------------------------------- >>> Ing. Jan Novotný >>> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >>> http://blog.novoj.net >>> Myšlenky dne otce Fura >>> -------------------------------------------------------------- >>> >> >> > > > -- > -------------------------------------------------------------- > Ing. Jan Novotný > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ > http://blog.novoj.net > Myšlenky dne otce Fura > -------------------------------------------------------------- >