您的位置:首页 > 其它

hibernate 查询与连接 (接上篇)

2006-12-26 17:12 274 查看
1、fetch实质上就是立即加载lazy="false"
2、
Team.hbm.xml
<set name="students" inverse="true" fetch="join" lazy="true">
<key column="team_id" />
<one-to-many class="model.Student" />
</set>
当session.get(Team.class,"112457458744");即取得一个Team对象时,
如果在<set name="students" inverse="true" fetch="join" lazy="true">
中设置了预先抓取,即fetch="join"后,则会自动抓取其子类Students的集合。
如果没有fetch="join",则只是取得当前对象Team
3、fetch="join"只是在session.get()或session.load();里才立即加载其所配置为fetch="join"的集合。对于上例是students
如果,为from Team t 则不起作用。只是输出一条select * from Team t;不加载students集合。
如果,为from Team t left join t.students 则对象间没有关系,所以会生成数组将每个select 出来的对象写入数组中。当作元素。
如果,为from Team t left join fetch t.students 则当取得每一个符合条件的Team时会立即加载每个Team的students集合。
这时,
list teamList ;
form () {
Team team = (Team) list.get(i);
Set stuSet = team. ;
}

附:fetch与lazy的比较:

如果 Student没有为Cer设置立即加载,也没有设置fetch="join"

如果Team为其子类Student设置了立即加载lazy="false",则

只输出两条sql:一条是Team,一条是Student通过与Certificate表外连接同时取得Student所对应的certificate。

sql1--> Hibernate: select team0_.id as id0_, team0_.teamName as teamName2_0_ from team team0_ where team0_.id=?
sql2--> Hibernate: select students0_.team_id as team5_2_, students0_.id as id2_, students0_.id as id1_, students0_.cardId as cardId0_1_, students0_.name as name0_1_, students0_.age as age0_1_, students0_.team_id as team5_0_1_, certificat1_.id as id0_, certificat1_.`describe` as describe2_1_0_ from student students0_ left outer join certificate certificat1_ on students0_.id=certificat1_.id where students0_.team_id=?

如果Team为其子类Student设置了预先抓取fetch="join",则

输出3条sql:
sql1--> Hibernate: select team0_.id as id1_, team0_.teamName as teamName2_1_, students1_.team_id as team5_3_, students1_.id as id3_, students1_.id as id0_, students1_.cardId as cardId0_0_, students1_.name as name0_0_, students1_.age as age0_0_ from team team0_ left outer join student students1_ on team0_.id=students1_.team_id where team0_.id=?
sql2--> Hibernate: select certificat0_.id as id1_, certificat0_.`describe` as describe2_1_1_, student1_.id as id0_, student1_.cardId as cardId0_0_, student1_.name as name0_0_, student1_.age as age0_0_ from certificate certificat0_ left outer join student student1_ on certificat0_.id=student1_.id where certificat0_.id=?
sql3--> Hibernate: select certificat0_.id as id1_, certificat0_.`describe` as describe2_1_1_, student1_.id as id0_, student1_.cardId as cardId0_0_, student1_.name as name0_0_, student1_.age as age0_0_ from certificate certificat0_ left outer join student student1_ on certificat0_.id=student1_.id where certificat0_.id=?

总结:

lazy="false"

首先加载所要load()的对象本例为Team(1条sql语句)。

然后,用一条sql将与循环出来的每个Team与其下的所配置为lazy="false"的对象相关联的所有子类用外连接left join读取出来。

fetch="join"

先外连接,再通过配置文件读取出其下的子类。(这点,我不太懂)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: