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