详细讲解在Hibernate中检索策略的应用

转载至:
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。 

类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,
通过在<不着class>上配置lazy属性来确定检索策略。
对于Session的检索方式,类级别检索策略仅适用于load方法;
也就说,对于get、qurey检索,持久化对象都会被立即加载而不管lazy是false还是true.
一般来说,我们检索对象就是要访问它,因此立即检索是通常的选择。
由于load方法在检索不到对象时会抛出异常(立即检索的情况下),
因此我个人并不建议使用load检索;而由于< class>中的lazy属性还影响到多对一及一对一的检索策略,
因此使用load方法就更没必要了。 

关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索,
又可分为一对多和多对多、多对一和一对一两种情况讨论。 

一对多和多对多关联关系一般使用< set>配置。< set>有lazy和outer-join属性,它们的不同取值绝对了检索策略。 

1)立即检索:这是一对多默认的检索策略,此时lazy=false,outer-join=false.尽管这是默认的检索策略,
但如果关联的集合是无用的,那么就不要使用这种检索方式。 

2)延迟检索:此时lazy=true,outer-join=false(outer-join=true是无意义的),这是优先考虑的检索方式。 

3)迫切左外连接检索:此时 lazy=false,outer-join=true,这种检索策略只适用于依靠id检索方式(load、get),
而不适用于query的集合检索(它会采用立即检索策略)。相比于立即检索,这种检索策略减少了一条sql语句,
但在Hibernate中,只能有一个配置成 outer-join=true. 

多对一和一对一检索策略一般使用< many-to-one>、< one-to-one>配置。
< many-to-one>中需要配置的属性是 outer-join,同时还需要配置one端关联的< class>的lazy属性
(配置的可不是< many-to-one>中的lazy哦),它们的组合后的检索策略如下: 

1) outer-join=auto:这是默认值,如果lazy=true为延迟检索,如果lazy=false为迫切左外连接检索。 

2) outer-join=true,无关于lazy,都为迫切左外连接检索。 

3) outer-join=false,如果lazy=true为延迟检索,否则为立即检索。 

可以看到,在默认的情况下(outer-join=auto,lazy=false),
对关联的one端对象Hibernate采用的迫切左外连接检索。依我看,很多情况下,
我们并不需要加载one端关联的对象(很可能我们需要的仅仅是关联对象的id);
另外,如果关联对象也采用了迫切左外连接检索,就会出现select语句中有多个外连接表,
如果个数多的话会影响检索性能,这也是为什么Hibernate通过hibernate.max_fetch_depth属性来控制外连接的深度。
对于迫切左外连接检索,query的集合检索并不适用,它会采用立即检索策略。 

对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,
它们的优点在于select语句简单(每张表一条语句)、
查询速度快,缺点在于关联表时需要多条select语句,增加了访问数据库的频率。
因此在选择即检索和延迟检索时,可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。
对于切左外连接检索,优点在于select较少,但缺点是select语句的复杂度提高,多表之间的关联会是很耗时的操作。
另外,配置文件是死的,但程序是活的,
可以根据需要在程序里显示的指定检索策略(可能经常需要在程序中显示指定迫切左外连接检索)。
为了清楚检索策略的配置效果如何,可以配置show_sql属性查看程序运行时Hibernate执行的sql语句

Hibernate的检索策略包括类级别检索策略和关联级别检索策略。

类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,

通过在<不着class>上配置lazy属性来确定检索策略。对于Session的检索方式,类级别检索策略仅适用于load方法;

也就说,对于get、qurey检索,持久化对象都会被立即加载而不管lazy是false还是true.

一般来说,我们检索对象就是要访问它,因此立即检索是通常的选择。

由于load方法在检索不到对象时会抛出异常(立即检索的情况下),因此我个人并不建议使用load检索;

而由于< class>中的lazy属性还影响到多对一及一对一的检索策略,

因此使用load方法就更没必要了。 关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。

对于关联级别检索,又可分为一对多和多对多、多对一和一对一两种情况讨论。

 一对多和多对多关联关系一般使用< set>配置。< set>有lazy和outer-join属性,它们的不同取值绝对了检索策略。

1)立即检索:这是一对多默认的检索策略,此时lazy=false,outer-join=false.尽管这是默认的检索策略,但如果关联的集合是无用的,那么就不要使用这种检索方式。

2)延迟检索:此时lazy=true,outer-join=false(outer-join=true是无意义的),这是优先考虑的检索方式。

3)迫切左外连接检索:此时 lazy=false,outer-join=true,这种检索策略只适用于依靠id检索方式(load、get),

而不适用于query的集合检索(它会采用立即检索策略)。相比于立即检索,

这种检索策略减少了一条sql语句,但在Hibernate中,只能有一个配置成 outer-join=true.

 多对一和一对一检索策略一般使用< many-to-one>、< one-to-one>配置。

< many-to-one>中需要配置的属性是 outer-join,

同时还需要配置one端关联的< class>的lazy属性(配置的可不是< many-to-one>中的lazy哦),

它们的组合后的检索策略如下:

     1) outer-join=auto:这是默认值,如果lazy=true为延迟检索,如果lazy=false为迫切左外连接检索。

     2) outer-join=true,无关于lazy,都为迫切左外连接检索。

     3) outer-join=false,如果lazy=true为延迟检索,否则为立即检索。

         可以看到,在默认的情况下(outer-join=auto,lazy=false),对关联的one端对象Hibernate采用的迫切左外连接检索。依我看,很多情况下,我们并不需要加载one端关联的对象(很可能我们需要的仅仅是关联对象的id);

另外,如果关联对象也采用了迫切左外连接检索,就会出现select语句中有多个外连接表,

如果个数多的话会影响检索性能,这也是为什么Hibernate通过hibernate.max_fetch_depth属性来控制外连接的深度。

对于迫切左外连接检索,query的集合检索并不适用,它会采用立即检索策略。

对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,

它们的优点在于select语句简单(每张表一条语句)、查询速度快,缺点在于关联表时需要多条select语句,

增加了访问数据库的频率。因此在选择即检索和延迟检索时,

可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。

对于切左外连接检索,优点在于select较少,但缺点是select语句的复杂度提高,多表之间的关联会是很耗时的操作。

另外,配置文件是死的,但程序是活的,可以根据需要在程序里显示的指定检索策略

(可能经常需要在程序中显示指定迫切左外连接检索)。

为了清楚检索策略的配置效果如何,可以配置show_sql属性查看程序运行时Hibernate执行的sql语句

 

内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值