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