00:00
我们一起来研究一下ha的检索策略。首先看一下什么是检索策略,我们为什么要来研究这个问题?实际上呢,我们在检索数据时需要注意两个问题,检索数据,即查询数据。第一个原则。不浪费内存。比方说我们这个卡跟al之间有这样的一个双向一对多的关联关系,那。当harm从数据库里边加载卡对象的时候,如果同时加载了其关联的out对象,而程序实际上仅需访问卡对象,这个时候我关联这个卡就白白的浪费了内存是吧?这是我们不希望发生的。另外一方面,我们还需要有更高的效率。嗯,我在有些情况下,我真就想我在获取卡通的时候。一并把这out即刻给我进行初始化,我希望这个时候能发送尽可能少的SQL语句,那能一条不发两条。
01:08
实际上呢。这两个问题啊,嗯,相辅相成。而且彼此之间还有点对立的这个意思啊,我们如何来搞定这两个问题,这就是我们在这个检索策略里边需要讲的。这里边儿的话呢,我们需要来讲几个问题啊。呃,类级别的检测策略。我翻看一下一对多,多对多的检索策略。以及多对一和一对一的检测策略。这样的三种,我们首先呢,我们来说第一种叫类级别的检测策略。类级别的检索策略有两种,包括立即检索跟延迟检索,这个词呢,我们在前边是说过的啊,立即检索,立即加载检检索方法指定对象,延迟检索,延迟加载检索方法,指定对象。
02:18
类级别的检测策略可以通过class圆柱的A属性进行设置。测试一下。To the。你把我前面那个卡特那个一对多拷过来。一对多的关联关系,双向。都过来吧。
03:01
Customer最后去掉了哈。没什么问题。这个包名需要改一下。里边的这些我也知道了。Order。给去掉了。把这个配置文件包含进来。Ping。Resource at,硅谷t strategy,下编当HPM。
04:04
还挺好,代沟。比较order。过来。我们先测试类级别的检索策略。Public test class。先长成对应的数据表,而且在里边添加几条记录。找一个。OK。看一下数据表。F5。
05:00
AMA。没问题。Customer。A。二。BB。30C。我们先来看类级别的,这个检索策略只有两种,一个叫立即检索,一个叫延迟检索,这个呢可以通过设置class的lazy属性来进行设置。先看一看吧。说或许。A。等于三点load.class。相转。Sit out。点get。
06:02
找一个。大家看这个时候我用漏方法获取到的这个class,如果要是不使用其任何属性的话,这是不是一个代理对象,这个这前面我们是说过。那这个的话呢,就是说我们这个customer class这个默认的lazy,实际上就是。啊,瞧一瞧。这个时候的方法就会直接。检索对应的数据表,然后把这个对象进行初始化。看。这个呢就叫立即检索。看PPT。立即检索,立即加载检索方法指定的对象,延迟检索,延迟加载简装方法指定对象,那什么时候进行加载呢?说。
07:02
爱使用。具体的属性是。在进行下载。类级别的检索策略可以通过class元素的类属性进行设置。那什么时候使用立即检索,什么时候使用延迟检索呢?说如果程序加载一个对象的目的是为了访问其属性的话,这个时候我们使用立即检索。如果程序加载一个持久化对象仅是为了获取获取其引用的话,我们就使用延迟检索,但是这个延迟检索需要注意的是,搞不好就会发生那个懒加载异常。注意部件懒。加载。长。因为你搞到的是一个代理对象。我真的需要用它属性的时候,你要保证这个时候三身是打开的,否则就会有懒加载异常。
08:11
无论是这个class lazy设置为true还是false,实际上它仅对漏的方法有效,而对这个GA以及我们后边的HKL跟QBC均无效,看到了吧?仅对漏的方法有效。那返回这个代理对象呢,有这样的一些特征啊,它运行时的时候呢,是由GG内部工具动态生成的,仅有这个ID是有属性值的,在我第一次访问非ID属性的时候,Harmlet会对其进行初始化。过来瞧一下harmon,那这个时候呢,我们倒是可以去访问其。ID属性。对ID属性,我什么时候付的。我在检索的时候,我不是存了一个一吗?所以说这个ID是有效的。
09:05
哦,我现在是立即检索。改一下,改为处。这种。案例是不是有效啊,那当我用到其非ID属性的时候,我就要初始化了。Get hot name。这个时候我们会看到这个思口语句啊,把这这个一的后边。然后再来打印这个卡通name,看到了吧,AA搜口语卷一。前面的话呢,是我们这个代理对象的这个,嗯,代理类的这个类名。OK,以上呢,就是我们说的这个类级别的检测策略,我们通常情况下都使用这个。默认值而不去修改的。大家需要注意的是,这个检索策略仅适用于漏的方法。
10:01
而且。要注意。不要发生那个懒加载异常。看下边的,我们来说一对多和多对多的检索策略,一对多多对多,我们主要说的是那个谁呀,是那个set。Customer,看这个。说的是他。我们将在这里边着重来讨论赛的三个属性,分别是。Lazy fe跟bench size。决定。奥特斯集合被初始化的时机。Fetch可以取三个值,分别是select select,还有join。如果是select跟select的话,它会决定初始化orders。
11:01
这个集合查询语句的形式,如果取值为join的话。将决定orders集合被初始化的时机,而且一旦要是取之于John,还会忽略lazy属性。半size。这个能够减少select语句的数目,提高延迟检索或立即检索的运行性能。嗯,大致上的话呢,先做一个了解下边one by万。这是整个的一个表哈,我们先来看这个。Lazy lazy取值是true跟false,我们前面实际上已经有所讨论了,下面我们来看说public。Money。Level。
12:02
At a test。Strategy。OK。讨论一下,这个时候的话呢,为了讨论他的话,我怎么办呢?我们需要在这个orders数据表里边加几条记录。这个呢,属于一。于二。吕赞。而最后这个谁也不属于保存,因为我们在他里边也有啊,也是只有三条记录是吧,这个里边的话呢,有十条记录看到了吧。
13:03
这里边儿的话,我们再加一条,加个四。大个DD看见这个时候这个DD怎么了,这个DD不跟任何一个order相关联,同样这个呃,接接这个JC也不跟。任何一个卡相关联。这是一个环境哈,下面我们来讨论一下,它首先的话呢,我还是来获取一个卡。等于三点,我们只用get点。一。And STEM?找一个。这个呢,我们在前面已经讨论过了是吧,这个时候我卡他们那个集合属性默认使用的是。延迟检索就是软加载。
14:01
Eagle。一对。多。或多对多。二集合属性默认使用。懒加载检索策略。这是第一个问题。加载,就是说直到我需要用这个集合属性的时候,它再进行加载,那比方说我们搞一个this out and at order。这个时候会来进行检索,那我们可以设置set的类属性来修改这个检索策略。可以通过修改set的。
15:03
非得属性来。修改设置。来修改。默认的检索策略。等一下。我们可以改,把它改为。AC默认是主,我们可以改为什么呀?False改为false意味着。在我检索卡的时候,它一并初始化orders。看一下这个A是不是后打的呀,我在。呃,检索卡的同时把这order集合进行初始化了,但是我们并不建议把它设置为false。默认为。
16:01
并不建议。设置为。这属于的话,就是无论在什么情况下。都是在。检索卡通的对象的时候,一并把这个al集合也检索出来,而且还发了两条SQL语句。看到吧,哎,两个字口诀要是一条的话,肯定性能也会高一些。这块发了两条。好了,这是取之于false。那实际上呢,三。还可以。设置为一个。什么叫?增强的。按之间做。曾强的颜值。
17:01
边说还可以这样。找一个瞧一瞧。怎么增强个法呢?嗯。哎哟,我们发现他确实没有把这个order进行初始化,而搞了一个什么呀,而搞了一个count,你看见了吗?啊,我想查这个size啊,他搞了一个矿,什么意思啊,他会尽可能延迟对这个集合初始化的时机。该曲值会定个能的延迟。集合初始化的。吃鸡。比方说啊,我们这个size,我们还可以再写一写来。
18:01
第三个比方说customer.get order,点我们写的,我们看是不是包含某一个order order order等于六。Order order.sid。比方说一。那我现在呢,需要重写一下奥德尔的库斯顿啊,重写一下奥德的子跟哈基库的方法,仅使用ID。走一个。回来。设置一下这个值是一,然后我们看是不是包含。快手看他是不是进行初始化了哈,看磁口。没有干什么了,他还是做了这样的一个查询,就是卡通ID等于什么?ID是谁呀?是他吗?All ID等于什么?反正我能不初始化就不初始化,这是这个extra。行到这块的话呢,关于这个laz属性就讲清楚了,取三个值,默认为处可以设置为false跟X。
19:05
这个false啊,我们基本上不会给它设置为false。很少直接给他设置,也有啊,极个别的情况。绝大部分的时候呢,我们取这个。默认值,因为我们确实是需要用到这个size属性了,就说明啊,我需要为这个我需要把这个集合进行初始化,这个时候呢,设置为这个X啊,反倒会多发送一条SQL语句。懂这个意思吧,所以说嗯,很多时候我们就取这个默认值为处,但是这两个属性,这两个属性的取值是需要大家了解的。这就是的lazy属性。Said the lazy。
20:04
PPT也看一下。延迟检索Lac属性值为true,实际上的话呢,Harm在以下情况初始化这个呃,代理类集合集合代理类的实例,第一次访问itator says it em contains,注意哈,这是取之为初的时候,并不是那个actor,或者是我们使用这个harmonate初始化方法,它也会进行初始化,我们看一看,即便取值为extra的话,那我们解一个harmonate。啊。不说话。这个。Customer and get orders。找一个。这个时候啊,它也会进行初始化,这方法很强的哈,啊,我们经常使用这样的方法,就是说我需要对集合的某一个代理对象进行初始化的话,显示的调一下它就可以了,有的时候很方便,因为我们那个类似的取值,大部分的时候都是处T使用延迟加载,你可以直接调这个方法,让他那个啊代理代理的属性,比方说这个呃,Orders啊,或者是customer啊。
21:17
初始化的话可以来调这个方法。我们还可以来把这个lazy设置为这叫什么增强延迟检索,它可以进一步延迟customer对象OS集合代理实力初始化的时机。什么时候初始化呢?你要是搞这个it的话,会导致这个orders集合进行初始化,这个没没办法是吧,像size啊,Contain啊,It empty方法呀,它会通过特定的S语句尽可能。不让我这个out进行初始化,但是大家不要是觉得哦这个可以啊,推迟这个这个这个初始化的时机,然后的话呢,把这个值就取为它。
22:04
实际上确实不是这样。因为开发的时候啊,你确实是需要用到这个size或者是content的时候,我们基本上我们就要。呃,用到这个集合里面。部分。对象的属性,部分对象的属性,所以说这个时候后边也要进行初始化,如果你要是取这个X戳的话,反倒会使它多发送磁口语句。听懂了吧,所以说大部分的时候的话呢,我们取为默认之处。个别的时候可以去false跟X开发的时候的话呢,我们详细的再跟大家说。Lazy说完了,下面我们来看这个。半指size。叫什么呀,叫批量的个数调一调。往上找。放一个VO。Excited。And size。
23:04
At。我们现在的话呢,我首先把我这个卡通都整出来了。等于。再整点瑞刚。Query。B。Customer这种方式呢叫查询,我们下节课我们就讲这个内容。大家看我是不是四个卡对吧,诶做了一个查询,但这个时候啊,我们看到这四个卡那个集合是不是还没初始化呢,好了,现在我要变历,然后呢。
24:03
我让那四个集合进行触手。不循环。我out一个。点get order点前提哈,这个为空。点get orders.up不等于no。只有这个时候啊,我才让他打印这个size,那大家说我这个时候。我除了这个查询customer,我为了初始化这个out,我需要打印多少个字,口语句几条啊?看数据表。123这三个对象都是有。S的,所以说。需要再打印三条SQL语句。
25:02
找一个。三。三。三哦,有问题是吧,我现在用的还是空,我并没有实际把那个奥斯机构进行初始化,为啥呀。刚才设过一个X,但是改回了,改为to来找。看见。Orders。Orders。Orders。奥,我这块是四条,为啥四条啊。不是三条啊,是四条,为啥呀,因为我这个家伙呀。嗯。如果要是没有任何元素的话,它返回一个空的集合,所以说搞出了四个。四条思考语句,那四条思口语句的话,有的时候我们感觉太多了,我能批量的对这个奥集合进行初始化吗?
26:06
再说一遍哈,我能批量的对这个auto集合进行初始化吗?于是过来S里边设置一个元素叫按S,不是四个集合吗?写个五。什么意思啊,我一次初始化五集合。够用了呀。再看。什么情况?是不是只有两条色块?啊,这里边儿的话用了一个in。看到了吧,我要是把这个改为。二呢?四个order,一次初始画两个,所以说这个时候需要发两条色口。看见了吧?一条色扣,两条色口,上面是查customer的,这就是be size。
27:00
写一下。S元素。元素的。Bench。Size主机。可以干什么呀?设定一次初始化。Set集合的数量,哎,我们这里边的是是吧,我说完这个查询之后呢,我实际上是有四个set集合需要被初始话,那我如果要是把这个set集合这个半set设置为五的话,我一次会初始化。五个set,那就一条四口就搞定了,你这个设置为二的话两次,设置为三的话两次,一个是三一个是一嘛,设置为一的话四次。设置为四的话,一次清楚了吧,这就叫be size。看下PPT。半带属性用来为延迟检索或立即检索设定批量检索的数量,它可以有效的减少select宇宙的数目,提高延迟检索或立即检索的运行性能,看到了吧?
28:12
我们就是在这个set里边搞了一个bench,它就代表着我一次可以初始化多少个激弧。OK。再看一个看什么呀,看一下这个fetch前边的话呢,我们研究了。Lazy研究了那个bench size,下面我们来说这个fetch fetch默认值叫select,诶,Fetch啥意思啊,叫。抓取。抓取。设置一下。分值就是。Le。设置一下。
29:04
Public avoid test edge。当然也是的。我们首先呢,还是来获取。实际上这个代码呀,是这样。And see。过来去跑一遍。哎,这个的话呢,我们设置了这个半只赛的。是几是二,于是的话呢,初始化就是这样一个效果,那我们看吧,我这个fe取值,取值叫select,抓取的方式是查询,于是的话,那我就这样查了。好了,我把这个值呢给它改一下,注意看哈,我改成一个萨。
30:03
票字查询。B。我抓取这个size的方式啊,叫子查询。找一个看着。看你有什么问题啊。我是不是一下子把所有的都初始化了呀?一共只有两条色口,我们看在这个Y就里边是不是有一个子查询呢?哎,Sub select就从这来的子查询。看见了吧,诶,它会把在内存里边所有的set都进行初始化。这个紫查询这个语句呢,就是把卡通的ID都拿过来,然后加上一个in就可以了,所以说。如果这个F的取值是sub select的话,将忽略size属性。笔记。
31:04
Fat集合的。一默认值为select select这个情况的话呢,我们看到了是吧,我就是通过查询的方式,呃,正常的方式来初始化这个。Order集合通过我们说正常的方式来初始化。在原著。第二个。可以取值为。什么意思啊,通过查询的。方式来铺纸画赛一口。而且是不使化。所有的在集合。
32:05
查询。作为where子句的印的条件。不见。子查询查询。所有一的一端的ad是吧。PPT。翻我们看。Set元,Set元素的属性取值为select或sub select决定初始化orders语句的查询形式,这个时候啊,那个lay还有效。
33:02
是吧,此时lazy有效,但是半size失效。这个此事。有。Bench。在吃角对吧。来。如果取之于join呢?不一样了,它将决定orders集合被初始化的时机,默认为select啊,当取之为sub select的时候。假定session缓存中里边有N个order集合没有被初始化,那我要是取之于sub,我一下子把这N个order都进行初始化。这个时候这个bunch size将被。忽略,那我这个子查询这个select呢,跟我查当时这个卡数据表那个select就差不多,只不过我只查的就是ID,而不查其他属性。
34:03
这句话简单的改一下,啊子查询中的select语句为查询啊表。O I did。三个月。行了,我们这样的话呢,这个取值为select说完了。下面看这个。取值为。John。若取值为join,则决定O集合被初始化的时机。Flash属性为join,第一点检索customer对象的时候呢,将采用迫切主外链接的检索策略来检索所有关联的out对象,这个的话呢,我们一会可以看到,而且我们讲HKL的时候也会来说它,然后lazy属性行为忽略,因为这个这是什么情况,它决定out机和被初始化的时机,这个lay没用了,你设置了加载。
35:02
没用。需要注意的是query list方法就是说我们用HQL查询呢,这个时候呢,它会忽略配置文件里边配的这个。啊,Fe等于转而依旧采用延迟加载的方式。回来我们改一下,把这个改值,把这个改为。对,好一个。看看我们的测试类。抽的是他嘛,是吧,这个时候我们看呢。那个size是不是生效了呀,它依旧使用延迟加载,为什么呀,因为我这块的话呢,用的是HQL查询。那我们再来举一个例子。Publicvoy t。The。At b,我来获取一个卡。
36:02
section.customer点一。Without orders搞一搞。大家看什么方式啊?这个SQ宇宙这个方式啊,叫左外链接,至于说什么叫迫切左外链呢,我们下节课详细讨论这块,我只会给你一个定义,我给你一个基本的这个表现状态。在我查询这个卡对象的时候,奥特集合是不是已经被初始化了呀?看我们这里边儿设的这个什么。Lazy。这块这个取值是不是处啊,但是被忽略了是吧,我们并没有使用那个来加载,而是通过主要链接的方式把这个集合进行初始化了。
37:05
笔记。第三条。若取值为。传。则。这个多一点,我们一个一个说3.1。在加载。一档。一端的对象是。使用迫切。所外。链接的方式。连锁。N的一端的。低核属性。啥意思啊?什么叫各界阻爱链接啊?
38:03
说一下就是使用左外。链接。进行查询。把集合属性。进行初始。啊,懂这个意思吧。就是说。破译主要链接哈,我使用主要链接进行查询,而且把那个集合进行初始化了,这就叫迫切主要链接。哎。3.2,当然忽略。属性。3.3我们要注意是SQL查询。忽略什么呀,忽略。Fetch。
39:01
等于lady f等于半的取值。所以说的话呢,这块我们特意在这个方法里边进行测试的,这就是。抓取。那归纳一下吧,整个这个fetch是什么意思啊。说白了就是。决定。初始化OS。集合的方式。对吧,可以取之为select some或者是转。回过来再看一下。说取之为select跟sub select的话,将决定初始化orders宇宙的查询形式。Fetch决定O集合被初始化的时机。以上呢,就是我们讲的这个一对多以及多对多。
40:04
检索策略主要讲什么啦?讲了这样的三个属性。取值可以是true false extra。Fetch可以取值为select select或者是join,还有一个be size就可以取一个数值。大家在这块的话呢,可以好好的这个看一下啊,挺重要的。最后呢,我们再来看一下这个多对一和一对一关联的检索策略。多对一,一对一,在我们配置文件里面对应的什么呀。对应着这个。Many图案或者是one图案。那对应的我们也要说这三个属性,分别是lazy fech,还有那个bench size。值得注意的呢,这个bunch size并不是设在这个节点上啊,而是设置的,而是设置在那个class节点上。
41:04
我们一会儿我们通过程序来进行说明。Laz属性值可以取三个,A proxy no proxy跟force常用的proxy跟false proxy采用延迟检索,Force采用立即检索。那fetch也可以设置为转。表示链接,这个时候的话呢,这个lay属性将被忽略。同样的,我们使用这个HQL查询的话,它也会忽略。Fetch取决于状元的情形。我们也可以来设定这个bench size。瞧瞧吧。出来。这种。Public world test,我们是money to one。To。One是Y。
42:04
ADD,首先搞一个order来。Get out class e。我们注意到这个时候的话呢,他只查了一个order,而没有查询其关联的卡。这就是我们。没有设置。AC属性取值为false,说一下稍等。A等于FOX再看。他不但获取了。Order也获取了卡,诶,为什么获取卡那语句比较复杂呀?
43:02
因为我们卡里边的话呢,我们设了一个fe,设了一个轮转甚这种。一样啊,OK,先获取的order,后来的话呢,获取了一个customer,我们要说的是谁呀。是这个哈,False lazy。Proxy跟force分别代表着。延迟检索跟立即检索。不做笔记了哈,这个比较简单。简单的写一下吧。Easy。矩值为。Proxy。和。Fourth分别。代表。对对应的属性采用。
44:02
恩驰建筑。和一起建筑。我们再来看这个fetch。FA可以取什么值啊?就是一个select一个段,对段的话要忽略LA通过。客气。主要连接的方式来。初始化及关联的属性找一个。大家看,I left out of dry,那这个时候呢?这里边我们来测试一下它。Without all than as。点at。Cock。他不会再做另外的这个发思口语句,因为我这个时候我在查out的时候呢,一定把卡进行初始化了。
45:07
取值为转。表示使用迫切左外链接的方式不止话。多把N关联的一的。E专档。主性就是说我order不是多吗?一不是卡直接始发了。三。来说一下这个SIZE2调,我们搞一个集合出来。Order等于。Fashion点。Query吧?
46:07
From。R。我将查询到所有的OS。If,如果。Order。Park get court name。我现在的话呢,我用的是HL查询,它将忽略这个fe,所以说我不用去改这个fe,直接找瞧一瞧。查看。
47:01
先访问了一个order,然后呢,访问了这个卡。访问的customer,访问的customer,因为我需要初始化的customer,一共就三个是吧,所以说的话呢,它就直接发了三个circle来初始化customer。那我能批量初始化吗?可以,我们需要在卡这个配置文件的class上边来设置这个。按size我取值为五或一次初始化五个调一下。是不是只有两条四口语句啊,一个是查询order,还有一个是利用这个in的方式去初始化。还没有初始化的customer。这个跟我们前面讲的那个半size有相似的地方。半size。说该属性需要设置在。
48:05
一啊一端啊,Glass属性中元素元素,嗯,类似于这样。过来。不用。一次初始化一的这一专。代理对象的数行了,就是我们讲的这个。嗯,Two one以及one two one的lazy fege跟半。那实际上的话呢,取之为状的话呢,它同样会。
49:00
为什么呀?忽略。非非属性是吧。大家看这个总结的话呢,可以看我目前这个代码,那你也可以看我们后边给大家设计的这些一个一个小的表格,我们就不带大家一个一个看了哈。
我来说两句