00:00
我们来研究一下持久化对象的状态。那前边呢,我们已经提过说站在持久化的角度,Harmlet把对象分为四种状态,分别是。持久化状态、临时状态、游离状态跟删除状态。Harmlet特定方法可以使对象由一个状态转到另一个状态,我们现在呢就来研究一下这四种状态以及对应的方法。首先的话呢,大致上我们先看一下,从这个理论上哈。第一个叫临时对象,临时对象,那临时状态的对象叫临时对象,后边这个持久化对象啊,这个删除对象啊,有理对象啊,和这个道理一样。Oid为空。不在塞真的缓存中,数据库没有对应的记录,这样的对象就称之为临时对象。
01:04
举一个例子,呃,比方说啊,你要入职到某某公司,你还没入职呢,这个时候你对于这个公司而言,你就是一个临时员工,你在这个公司里边没有对应的ID号,就是你的员工号。你也不在公司的监管之下,那公司里边也确实是没有你这个人。持久化对象,也叫托管对象,托委托管理。ID不是空。在塞身缓存中什么意思啊啊,你进到公司里头了是吧,你有这个员工号。同时呢,哎,你接受公司的这个监管,比方说你今天迟没迟到啊,你今天请没请假呀,公司都会知道。持久化对象跟数据库中相关的记录对应。在调用session的flash方法的时候,会根据持久化对象的属性变化来同步更新数据库。前面的话呢,我们已经看到了最后一句话,在同一个session实例的缓存中,数据表中每条记录只能对应着唯一的持久化对象。
02:15
能明白这个意思吧,就是说30缓存里边的话呢,我不可能有。一条记录对应着两个持续化对象,这样的话我以哪个来更新呢?这是要出问题的,我们在后边进行这个测试的时候的话呢,我们会看到这个问题。到时候会抛出一个异常出来。删除对象,数据库里边没有对应的记录,也不在赛的缓存中。这个就是曾经。嗯,在数据库里边有过记录,曾经被塞身监管过。举一个例子。比方说你。被公司开除了。那你这个时候你就是一个删除对象。
03:02
游离对象,这也叫托管什么呀?脱离管理。OID不是空,不在塞身缓存里边,一般情况下呢,这个游离对象是由持久化对象转变而来的,数据库中可能有跟他对应的记录,就是说比方说你是在这个公司里面,但是你请假了。这个时候你跟公司分开了,那你现在的话,你就不受公司的这个管理,但是你是有你是有员工号了,在这个公司里边的话,也有你对应的记录,这叫。游离对象也叫托管对象,我们为了区分呢,这个我们称之为持久化对象,而这个称之为游离对象。看一个图。这个图里面呢,呃,我们画出了这三种状态,然后还有各个这个。
04:01
方法来把这个状态之间进行转换。我new的一个对象肯定是一个临时对象,临时状态,我调用save persist merge以及save update,它会变为持久化状态。也有可能我直接掉get或者load,它也会变变持续化状态,后几个方法我们再讲。SQL查询的时候会接触到。调用持久化对象的eva cloud跟clear方法会使这个对象变为。游离对象,同样,游离对象反过来调update save update跟merge会变为持久化对象,那我无论是一个这个临时对象还是一个游离对象,我调delete都会变为。删除状态,那这个时候的话呢,他们有可能会被垃圾回收,嗯,下边我们就详细的来研究一下这其中的每一个方法,反手打标记的啊,我们都要一个一个说这些都是。
05:13
这两这个的话呢,暂时先不研究。后边讲的时候呢,也会说第一个方法,Save方法。这个税务方法呢,我们在前面已经说过了,它是把一个。临时对象变成持久化对象,同时呢,把这个临时对象保存到数据库里面,News news等于newnews6.s。Title,哎,我们取个AA 6.authoraa小的news set date new date,执行一个session.save news。
06:18
打印一下set out news下来。大家说我在这个save的前后,这个news会发生什么变化呀?先跑一下看看效果。我们现在我们这个什么,我们现在我们的这个呃,组件的生成方式呢,用的还是高级算法是吧,是harm net根据一个算法帮我们生成ID,所以说会呃额外的打印两条。词后语句一个是select,一个是update,这个的话高级转法,我们后面来说,我们来看这个打印啊,打印的时候的话呢,我在打印这块,这个news就是ID是空对吧,Aaaa,然后时间下。
07:09
再看这块儿ID是不是有值了呀,啊,开头date没问题,所以说执行save方法前后最大的一个不同就是。执行save方法之后。我要为这个临时对象分配ID。四有方法,第一个对他是一个。临时对象变为持久化对象。二为。对象分配ID。
08:03
三。呃,应该是会计划,计划执行一条什么呀。Insert吧,是吧,在我刷新在我flash缓存的时候,它会发送一条insert。在flash缓存时会发送一条INSERT1卷四,还有别的吗?还有别的吗?还有比较关键的就是这个。ID的问题。ID是用来唯一标识这个对象的,就是这个对象跟数据表之间这个关系的,我们看啊叫32768刷一下在这儿呢,32768这个ID呀,有两点特殊,第一点。
09:09
我这样写6.setid我写个100,我写上了哈,这改为BB。BB,我找一个瞧一瞧。大家看。这块我设置100了,那实际上插入之后这个ID值它是不是重新分配了呀,看到了吧,65536刷一下。A6536。就是说在我save方法之前设置这个ID是无效的,在save方法之前的ID是无效的。五下一个需要注意的,那我C方法之后的话,那么有了一个ID,这个ID能改吗?6.sid我也写个101啊,这边写一个哈CC。
10:15
CC,瞧瞧。早。什么问题啊?是抛了一个异常啊,他说这个ID啊,不让改啊,持久化对象的ID是不能被修改,持九化对象的ID是不能被修改的,为什么呀,因为我就是靠着这个ID。去跟我数据表里面那个记录对应呢,你改完之后我跟谁对应啊。ID是不能够进行修改。数据表插入了。哎哟,我这个CC没进来啊,啊没进来是吧,因为我这块怎么了,因为我这块的话呢,抛了一个异常,这里边应该是有三条记录开始了Java aab。
11:06
好了,这就是我们的save方法。那跟save对应的还有一个很类似很类似的一个叫persist,看一下public test perist。这个方法跟save方法都可以完成一个隐色操作。CTRLC看一看。弟弟。执行一个process。点persist news o了找一个。
12:04
啊,我们也看到有一个insert。进来问题。Persist也会,也会执行insert操作好了,那问题是它和我们的这个save方法有什么区别呢?有什么区别呢?刚才我们在复制的时候啊,就是我是不是设过一个ID啊,把它给删了,现在的话呢,给它加上set ID,我写成一个二百一一好走一个。
13:03
怎么了?他是不是抛了一个异常呢。这就是persist。就是说,如果在process方法之前已经有ID了,那我将不会执行隐私的操作,而是抛出一个异常。在。Persist方法之前在调用。这个方法之前落对象已经有ID了,则不会。执行insert,而相反的会抛出一个异常,会抛出异常。哎,这是跟save方法的一个区别,Save是不是没问题啊,你有ID的话不管用。
14:05
这是我们这块这个process方法。PPT。我们刚才讲的点的话呢,基本上我们刚才都说了啊,大家也可以来看我的这个PPT,呃,我以前这块写的是刷新缓存,这个刷新呢。不是特别的确切,因为我们那个refresh应该翻译为刷新这个flash是把呃session这个状态同步到数据库里面,所以说的话呢,我们改为什么呀,改为就叫flash,我们我们这样叫。好吧,不翻译了。下一个看get跟load。加载一个对象。到内存。Public test at test,这个我们在前面已经讲的比较多了哈,我搞出一个对象出来,News news等于session.get news.class1。
15:13
保存sit out news找一个。42行。执行了一个select操作,然后的话我们进行打印了。Get,那有什么要说的吗?没什么要说的。我们下面要说的就是它这个load的对比的话,就有有的要说了,Load来at test。我下移一个上去,注意哈,把这个改为load好,我们跑这个。
16:06
我们看到是不是也是一个select,然后一个打印呢,表面上看是一样的,但是有区别。第一个区别。住掉。住掉。我来执行get。只要我调这个get方法的话,他马上就会。发送一条SQL语句,把这个对象查出来,Load。诶,没搞错吧,再看一遍。我调这个漏的方法的话呢,他并没有马上执行查询,那干什么了呀,看看。点get class get name。
17:00
走。他是个什么呀?它是一个。代理对象OK get跟load get Vs load这个呢?呃,我们以后在面试的时候也有问这样问题的,说哈姆类get方法的方法有什么区别啊,我们这块就详细的来说一下有什么区别,第一个说执行get的方法会立即加载对象。而执行漏的方法,若啊不使用该对象,我这块的话呢,就做了一个打印的哈,我并没有用到这个对象本身的属性,则不会立即。
18:01
执行查询。操作而返回一个。代理对象。第一个区别。概括的说。Get立即查询load使用的是一个叫延迟加载,我不用的话我就不加载,用的话我再加载。是吧,这个叫立即检索,这个叫延迟检索,也可以这样说,Get是立即检索,Load是延迟检索,什么延迟检索呢?用的时候我在检索,就像我们平常。这个需要看书式的是吧,直到我考试之前我才看,平常我不看叫延迟,这个是利己啊,平常我总看。
19:02
第一个。第二个。再看那。如果我在数据库里边没有对应的记录呢?比方说我写个十。把这个打开。下来。十没有返回空看。怎么了?是不是抛了一个异常啊,OK。若对,若数据表中没有对应的记录,Get,返回no load抛出异常,能理解为什么会有这个异常吧?
20:10
我都已经给你返回一个代理对象了,然后你告诉我这个对象没有,那我如那我对这个代理对象怎么怎么交代呀。是吧,你就像你答应答应人一件事,OK,我这个代代表都已经去了是吧,然后你说这事办不了了,那肯定肯定要跑一场,这个呢,就是我办不了了,我就说我不能办,返回一个闹啊,这块有这样的一个区别三。第三个呢,我们要去认识一个特别重要的一个异常。都改为一。我们知道这个时候每个方法都是可以正常执行的。没问题。
21:01
这个也。没问题,好了,现在呢,我这样说,我在打印这个对象之前加一个3.close。上来。代码我需要注意一下。好了,我们来看这个盖。这没问题吧,是吧,哎,这没问题,因为我在调这一行的时候,这个对象已经被我加载了,所以说可以打印看这个方法。找一个。咋啦?是不是抛了一个懒加载异常啊,嗯,需要注意的第三点说。
22:00
漏的方法可能会抛出懒加载异常。叫。Lazy in他。Exception,这个exception可能会抛出这个异常。为什么会抛这个异常呢?哎,这个实际上是跟低点有关系,因为我漏的,我反馈的是一个代理对象,我需要去把这个代理对象填充的时候,我再查我我再去查数据库,但你问题是你现在把财关了,那个链接是不是断了呀,我还怎么去加载呀,加载不了了。啊,所以说他可能会跑一可能会抛这个异常说什么啊,在需要。初始化。代理对象是代理对象之前吧,代理对象之前已经关闭了session啊,这个时候就可能会抛出这个异常,这个异常的话呢,我们在后边会经常提到,抛这个异常的原因就是这个,我想把这个代理对象进行初始化,但是你在成关了,我就会有这个异常。
23:25
OK,这就是get跟load方法的三个区别,第一个get立即加载,Load是延迟加载。这个我们改为第二个哈。第二个。就因为这个漏是延迟加载,所以说呢,它可能会抛出,抛出这个懒加载异常,因为我在需要初始化的时候,但是已经关了第三个。如果数据表里边没有对应记录的话,Get返回now load会抛出异常。
24:08
那这块这个漏子抛出异常,这个我们再说一下。比方说我写个十,但是我不用这个对象。把这个打开了哈,这个也需要拿掉。哦。Get这个主角好漏的方法找一个。这个时候是没问题的,对吧,什么时候有问题啊,是在使用这个对象的时候有问题。数据库里面没有对应记录。啊切三身也没有被关闭,但啊三身没关,数据库里边没有对应记录,同时需要使用对象是。
25:24
这个时候呢,这个漏会抛异常盖返回一个空,看到了吧,就是说你如果要是就是一个加载的话没问题,但是你需要用这个对象了,这不行。数据表中没有对应记录三也没有被关闭啊。Get方法,直接返回一个空。漏的方法应该这样说是吧,漏的方法。Load说若不使用使用该对象的任何属性没问题,好了,那就是若需要初始化了啊,抛出异常啊,这个时候抛跟我们前面讲那个例子是对应的。
26:20
我这个事情呢,我答应了他没让他,他他没让我办,没问题,让我办了跑一场懂吧。二干的就是你让我办个事儿,我就告诉他办不了,后边不会有异常,办不了了,而这个就是OK,答应了,但是办的时候不行,跑腿长,这就是get跟load的区别。三点。
我来说两句