关于mybatis延迟加载的问题

我做了一个mybatis的demo里面有两个类:user address,user中存放着一个address,而在数据库中user表中有一个addressid的字段,用于关联address表。

public class User {
private int id;
private String name;
private String password;
private int age;
private Address address;
//get set方法
}
public class Address {
private int addid;
private String addname;
private int zipcode;
//get set方法
}

mybatis配置文件

<!-- 延迟加载设置 -->
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
</settings>

<!-- 别名 -->
<typeAliases>
    <typeAlias type="com.qshun.model.User" alias="user"/>
    <typeAlias type="com.qshun.model.Address" alias="address"/>
</typeAliases>

<!-- 环境参数(数据库连接) -->
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost/ibatis" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </dataSource>
    </environment>
</environments>  

<!-- 映射文件 -->
<mappers>  
    <mapper resource="com/qshun/model/AddressMapper.xml"/>
    <mapper resource="com/qshun/model/UserMapper.xml"/>
</mappers>

usermapper的实体映射文件

<resultMap type="user" id="UserResultMap">
    <result property="id" column="uid" />
    <result property="name" column="uname" />
    <result property="password" column="upassword" />
    <result property="age" column="uage" />
    <association property="address" column="addressid" select="getAddressById" resultMap="AddressResultMap">
    </association>
</resultMap>

<resultMap id="AddressResultMap" type="address">  
    <result property="addid" column="id"/>
    <result property="addname" column="addressname"/>
    <result property="zipcode" column="zipcode"/>
</resultMap>  

<select id="getUserById" resultMap="UserResultMap" parameterType="int">
    select uid,uname,upassword,uage,addressid 
    from user 
    where uid=#{id}
</select>

<select id="getAddressById" resultMap="AddressResultMap">
    select addid, addname, zipcode 
    from addr 
    where addid =#{addressid}
</select>

测试类

private static SqlSession session = null;
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
Reader reader = Resources.getResourceAsReader("MybatisConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
session = sqlSessionFactory.openSession(true);
reader.close();
} catch (IOException e) {
throw new RuntimeException("=========" + e, e);
}
}

public static void main(String[] args) {

    UserMapper mapper=session.getMapper(UserMapper.class);
    User u=mapper.getUserById(1);//理论上讲在执行此操作的时候,不会将address对象查询出来
    System.out.println(u.getName());
    System.out.println("================");
    System.out.println(u.getAddress().getAddname());//此时address才会被执行查询
    //但是事实上在执行mapper.getUserById(1)的时候,就执行了address对象的查询,延迟加载没有起效
    session.close();
}

另附建表语句
CREATE TABLE ibatis.add (
addid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
addname VARCHAR(45),
zipcode VARCHAR(45),
PRIMARY KEY (addid)
)
ENGINE = InnoDB;

CREATE TABLE ibatis.user (
uid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
uname VARCHAR(45),
upassword VARCHAR(45),
uage VARCHAR(45),
addressid VARCHAR(45),
PRIMARY KEY (uid)
)
ENGINE = InnoDB;

请各位牛人,帮忙解答一下,不胜感激 :D

你的代码存在问题。
1、
setting文件这样配置



只有这两个属性都配置了才能生效!

2、下面的映射也有问题,我就不更正了,给你个例子参考




<select id="getStudentById" parameterType="int" resultMap="studentResultMap2">
    SELECT id,name,classid
      FROM student s 
     WHERE s.id=#{id} 
</select>

<select id="getClassesById" parameterType="int" resultType="classes">
    SELECT id,name
      FROM classes c 
     WHERE c.id=#{id} 
</select>

3、我有空会把这个demo代码放到我的博客中,要是还是搞不定你再看看。

[quote]UserMapper mapper=session.getMapper(UserMapper.class);
User u=mapper.getUserById(1);//理论上讲在执行此操作的时候,不会将address对象查询出来
System.out.println(u.getName());
System.out.println("================");
System.out.println(u.getAddress().getAddname());//此时address才会被执行查询
//但是事实上在执行mapper.getUserById(1)的时候,就执行了address对象的查询,延迟加载没有起效
session.close(); [/quote]

请问你把这查找用户和查找地址写在一段程序里面,是如何判断它有没有延迟加载的呢?是通过日志输出是否在“=========”前面来查看的吗?

为什么要用association标签?
不是应该也用result的么?