Hibernate检索策略学习之--延迟加载

 

所谓延迟加载,是在读取查询对象时,不立即取回其所关联的对象,只返回其对象的一个代理,并没有实际数据,当需要用到关联对象的属性时,这是再发送SQL进行数据库查询,减少了不必要的数据库资源我们有三个实体对象Student,Team,Cerificate

其中Student和Team是1对1的关系,采用主键关联的方式(Student的id和Certificate的id保持一致) 
        Team和Student是一对多的关系(反之为1对多)

在Mysql中运行以下脚本,建立数据库

 



CREATE   TABLE  certificate (
  id 
varchar ( 100 NOT   NULL   default   '' ,
  description 
varchar ( 100 default   '' ,
  
PRIMARY   KEY   (id)
);





CREATE   TABLE  student (
  team_id 
varchar ( 100 default   '' ,
  id 
varchar ( 100 NOT   NULL   default   '' ,
  name 
varchar ( 20 default   '' ,
  cardId 
varchar ( 20 NOT   NULL   default   '' ,
  age 
int ( 11 default   ' 0 ' ,
  
PRIMARY   KEY   (id)
);






CREATE   TABLE  team (
  id 
varchar ( 100 NOT   NULL   default   '' ,
  teamName 
varchar ( 100 default   '' ,
  
PRIMARY   KEY   (id)
);



INSERT   INTO  certificate  VALUES  ( ' 1 ' , ' 110108 ' );
INSERT   INTO  certificate  VALUES  ( ' 2 ' , ' 110109 ' );

INSERT   INTO  student  VALUES  ( ' 1 ' , ' 1 ' , ' tomclus ' , ' 2006m ' , 33 );
INSERT   INTO  student  VALUES  ( ' 2 ' , ' 2 ' , ' tom ' , ' 2007m ' , 22 );
INSERT   INTO  team  VALUES  ( ' 1 ' , ' team1 ' );

 

建立对应的Pojo对象

 

package  Search.immediately;

public   class  Certificate ... ... {
    
private String id;
    
private String description;
    
private Student stu;

    
public Student getStu() ......{
        
return stu;
    }


    
public void setStu(Student stu) ......{
        
this.stu = stu;
    }



    
public String getDescription() ......{
        
return description;
    }


    
public void setDescription(String description) ......{
        
this.description = description;
    }


    
public String getId() ......{
        
return id;
    }


    
public void setId(String id) ......{
        
this.id = id;
    }

}




package  Search.immediately;

import  java.util.HashSet;
import  java.util.Set;


public   class  Team ... ... {
    
private String id;
    
private Set students=new HashSet();
    
private String teamName;
    
private Set tests;
  
    
public Set getTests() ......{
        
return tests;
    }

 
    
public void setTests(Set tests) ......{
        
this.tests = tests;
    }


    
public String getId() ......{
        
return id;
    }


    
public void setId(String id) ......{
        
this.id = id;
    }


    
public String getTeamName() ......{
        
return teamName;
    }


    
public void setTeamName(String name) ......{
        
this.teamName = name;
    }


    
public Set getStudents() ......{
        
return students;
    }


    
public void setStudents(Set students) ......{
        
this.students = students;
    }

}




package  Search.immediately;

public   class  Certificate ... ... {
    
private String id;
    
private String description;
    
private Student stu;

    
public Student getStu() ......{
        
return stu;
    }


    
public void setStu(Student stu) ......{
        
this.stu = stu;
    }



    
public String getDescription() ......{
        
return description;
    }


    
public void setDescription(String description) ......{
        
this.description = description;
    }


    
public String getId() ......{
        
return id;
    }


    
public void setId(String id) ......{
        
this.id = id;
    }

}

本文中,Student和Certificate为还为立即加在,student和team双向1对多,多对1采用延迟加载

Student.hbm.xml

 

<? xml version="1.0" encoding="utf-8" ?>
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--  
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
< hibernate-mapping  package ="Search.lazy"   >
    
<!--  设置非延迟加载,由于many-to-one不能设置lazy属性,所以我们在class上
          设置,但one-to-one的cer属性不需要延迟,怎么办呢?我们可以在one-to-one上
          再设置一下lazy="true",这样one-to-one就会使用自己的lazy设置了
-->
    
<

你可能感兴趣的:(sql,Hibernate,xml,mysql,MyEclipse)