Hibernate的检索策略
来源:互联网 发布:新华社cnc网络电视台 编辑:程序博客网 时间:2024/04/25 21:04
一, Hibernate的检索策略包括类级别检索策略和关联级别检索策略。Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
二, 类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。
三, 立即检索
在映射文件中设置<hibernate-mapping
package="cn.csdn.producets.domain" default-lazy="false">
<classname="Customers" table="Customers" lazy=”false”>
<setname="orders" lazy="false">
四, 延迟检索
设置lazy=”false”不采用延迟检索
<set name="orders" lazy=”false”>
Customers c=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
运行结果:Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.passas pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_,customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customerscustomers0_ where customers0_.id=?
Hibernate: select orders0_.cid as cid0_1_,orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_,orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate asodate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cidas cid1_0_ from orders orders0_ where orders0_.cid=?
设置lazy=”true”采用延迟加载
<set name="orders" lazy=”false”>
Customers c=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
运行结果:Hibernate: select customers0_.id as id0_0_,customers0_.realName as realName0_0_, customers0_.pass as pass0_0_,customers0_.sex as sex0_0_, customers0_.petName as petName0_0_,customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from Customerscustomers0_ where customers0_.id=?
总结:采用懒加载是会少输出一条sql查询语句;
五,关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。
Fech=”join”;
第一种测试方式:<set name="orders" fetch="join" lazy=”true”>
Customers c=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
代码执行结果:
Hibernate: select customers0_.id as id0_1_,customers0_.realName as realName0_1_, customers0_.pass as pass0_1_,customers0_.sex as sex0_1_, customers0_.petName as petName0_1_,customers0_.email as email0_1_, customers0_.rdate as rdate0_1_, orders1_.cid ascid0_3_, orders1_.id as id3_, orders1_.id as id1_0_, orders1_.number asnumber1_0_, orders1_.address as address1_0_, orders1_.phone as phone1_0_,orders1_.odate as odate1_0_, orders1_.sum as sum1_0_, orders1_.status asstatus1_0_, orders1_.cid as cid1_0_ from Customers customers0_ left outer joinorders orders1_ on customers0_.id=orders1_.cid where customers0_.id=?
可以从运行结果中得知:采用迫切左外链接
第二种测试方式:<set name="orders" fetch="join" lazy=”false”>
Customers c=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
代码执行结果:
Hibernate: select customers0_.id as id0_1_, customers0_.realNameas realName0_1_, customers0_.pass as pass0_1_, customers0_.sex as sex0_1_,customers0_.petName as petName0_1_, customers0_.email as email0_1_,customers0_.rdate as rdate0_1_, orders1_.cid as cid0_3_, orders1_.id as id3_,orders1_.id as id1_0_, orders1_.number as number1_0_, orders1_.address asaddress1_0_, orders1_.phone as phone1_0_, orders1_.odate as odate1_0_,orders1_.sum as sum1_0_, orders1_.status as status1_0_, orders1_.cid as cid1_0_from Customers customers0_ left outer join orders orders1_ oncustomers0_.id=orders1_.cid where customers0_.id=?
可以从运行结果中得知:采用迫切左外链接
第三种测试方式:<set name="orders" fetch="join" lazy=”extra”>
Customers c=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
代码执行结果:
Hibernate: select customers0_.id as id0_1_,customers0_.realName as realName0_1_, customers0_.pass as pass0_1_,customers0_.sex as sex0_1_, customers0_.petName as petName0_1_,customers0_.email as email0_1_, customers0_.rdate as rdate0_1_, orders1_.cid ascid0_3_, orders1_.id as id3_, orders1_.id as id1_0_, orders1_.number asnumber1_0_, orders1_.address as address1_0_, orders1_.phone as phone1_0_,orders1_.odate as odate1_0_, orders1_.sum as sum1_0_, orders1_.status asstatus1_0_, orders1_.cid as cid1_0_ from Customers customers0_ left outer joinorders orders1_ on customers0_.id=orders1_.cid where customers0_.id=?
可以从运行结果中得知:采用迫切左外链接
总结:若把fech属性设置为join则lazy属性就不起作用
二.Fech=”select”
第一种测试方式:<set name="orders" fetch="select" lazy=”true”>
Customersc=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
System.out.println(c.getOrders().size());
运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName asrealName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?
null
Hibernate:select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_,orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phoneas phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_,orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_where orders0_.cid=?
1结论:采用延迟加载;
第二种测试方式:<set name="orders" fetch="select" lazy=”false”>
Customers c=(Customers) session.get(Customers.class, 2);
运行结果:Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?
Hibernate:select orders0_.cid as cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_,orders0_.number as number1_0_, orders0_.address as address1_0_, orders0_.phoneas phone1_0_, orders0_.odate as odate1_0_, orders0_.sum as sum1_0_,orders0_.status as status1_0_, orders0_.cid as cid1_0_ from orders orders0_where orders0_.cid=?
结论:采用立即检索
第三种测试方式:<setname="orders" fetch="select"lazy=”extra”>
Customersc=(Customers) session.get(Customers.class, 2);
System.out.println(c.getEmail());
System.out.println(c.getOrders().size());
运行结果:Hibernate: selectcustomers0_.id as id0_0_, customers0_.realName as realName0_0_,customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petNameas petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from Customers customers0_ where customers0_.id=?
null
Hibernate:select count(id) from orders where cid =?
1
结论:采用延迟加载
总结:听从lazy属性的
三.Fech=”subselect”;
第一种测试方式:<setname="orders" fetch="subselect"lazy=”true”>
Customers c=(Customers)session.get(Customers.class, 2);
System.out.println(c.getEmail());
System.out.println(c.getOrders().size());
Set<Orders>orders=c.getOrders();
for(Orders o:orders){
System.out.println(o.getNumber());
}
session.close();
}
运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName asrealName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_,customers0_.petName as petName0_0_, customers0_.email as email0_0_,customers0_.rdate as rdate0_0_ from Customers customers0_ wherecustomers0_.id=?
null
Hibernate: select orders0_.cid as cid0_1_,orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_,orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate asodate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cidas cid1_0_ from orders orders0_ where orders0_.cid=?
1
2
结论:采用延迟加载;
第二种测试方式:<setname="orders" fetch="subselect"lazy=”false”>
Customers c=(Customers)session.get(Customers.class, 2);
System.out.println(c.getEmail());
System.out.println(c.getOrders().size());
Set<Orders>orders=c.getOrders();
for(Orders o:orders){
System.out.println(o.getNumber());
}
session.close();
}
运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName asrealName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_,customers0_.petName as petName0_0_, customers0_.email as email0_0_,customers0_.rdate as rdate0_0_ from Customers customers0_ wherecustomers0_.id=?
Hibernate: select orders0_.cid as cid0_1_,orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_,orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate asodate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cidas cid1_0_ from orders orders0_ where orders0_.cid=?
null
1
2
结论:采用立即检索
第三种测试方式:<setname="orders" fetch="subselect"lazy=”extra”>
Customers c=(Customers)session.get(Customers.class, 2);
System.out.println(c.getEmail());
System.out.println(c.getOrders().size());
Set<Orders>orders=c.getOrders();
for(Orders o:orders){
System.out.println(o.getNumber());
}
session.close();
}
运行结果:Hibernate: select customers0_.id as id0_0_, customers0_.realName asrealName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_,customers0_.petName as petName0_0_, customers0_.email as email0_0_,customers0_.rdate as rdate0_0_ from Customers customers0_ wherecustomers0_.id=?
null
Hibernate: select count(id) from orders wherecid =?
1
Hibernate: select orders0_.cid as cid0_1_,orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number as number1_0_,orders0_.address as address1_0_, orders0_.phone as phone1_0_, orders0_.odate asodate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_, orders0_.cidas cid1_0_ from orders orders0_ where orders0_.cid=?
2
结论:采用延迟检索
总结; Lazy属性决定检索策略
对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,它们的优点在于select语句简单(每张表一条语句)、查询速度快,缺点在于关联表时需要多条select语句,增加了访问数据库的频率。因此在选择即检索和延迟检索时,可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。对于切左外连接检索,优点在于select较少,但缺点是select语句的复杂度提高,多表之间的关联会是很耗时的操作。另外,配置文件是死的,但程序是活的,可以根据需要在程序里显示的指定检索策略(可能经常需要在程序中显示指定迫切左外连接检索)。为了清楚检索策略的配置效果如何,可以配置show_sql属性查看程序运行时Hibernate执行的sql语句。
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- Hibernate的检索策略
- 【Hibernate的检索策略】
- hibernate的检索策略
- Hibernate 的检索策略
- hibernate的检索策略
- hibernate的检索策略
- hibernate的检索策略
- Oracle的学习四:数据库管理员、逻辑备份与恢复、数据字典、动态性能视图、管理表空间与数据文件
- oracle的学习五:数据的完整性、索引、权限、角色
- oracle的学习六:pl/sql基础(数据类型、定义变量)、游标、过程、函数、包、触发器(系统触发器)
- Oracle的学习七:控制语句、异常、视图
- TagName的使用
- Hibernate的检索策略
- 多线程不同步读写共享资源
- 关于Android的开机RLE格式图片
- Hibernate 中文乱码
- Hibernate session缓存介绍与使用
- Ubuntu系统安装工序
- 篮球胜八卦
- android文件下载!download!
- Hibernate对象的状态