Hibernate检索策略学习之--预先抓取

所谓预先加载,是指hibernate通过select语句使用outer join(一般为左外连接left outer join)来获取对象的关联实例或者关联集合(集合被初始化了,这是重点,和延迟加载不同)

我们有三个实体对象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;
    }

}

 

<!--推荐1对多,多对多使用延迟加载,而多1对1,多对1采用预先抓取-->

设置student对team及certificate进行预先抓取

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.fetch"   >
   
    
< class  name ="Student"  table ="student"  lazy ="true" >
       
< id  name ="id"  column ="id"  unsaved-value ="null"

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