00:00
Session的update方法。Update方法是一个游离对象转变为持久化对象,并计划执行一条update语句。测试一下。首先呢,我们说update方法得什么时候用?Update这个意思叫更新,那实际上我们前边。没调用过这个方法,是不是也看见那个office语句了呀,对吧。又是怎么回事呢?搞一下啊,获取一个news。ID是一。
01:00
六点赛个。看数据表。这个呢,就散。改成Oracle。这个时候我要是照这个test update方法的话,怎么样,是不是看。控制台里边打印一个update语句啊。跑一下。哎,这个前面呢,我们已经认真的研究过了,在说那个flash的时候还记得吧,因为。我们调用这个transaction的commit,在真正提交事务之前,他会先来执行一个flash操作,看一看。赛身缓存里边这个对象的这个状态跟数据表记录的这个状态一不一样,不一样的话就会执行一个更新。所以说我们说啊。我要是去更新这个持久化对象的属性,显然我可以不掉这个update方法,当然了,你就是掉了一个的话。
02:09
不出。写一下不爽。没问题,但是呢,这句话是可以不写的。Rock。更新一个。持久化对象的。我不更新一个持久化对象不需要。显示。要用。这个方法。因为。在盗用。Transaction。
03:02
方法。你先。执行三身啊。方法。这个呢,前面我们已经详细的研究过了。那既然不这个时候用的话,什么时候用呢。我们来看这么一个状态哈。我在。获取这个对象跟修改属性之间写四行代码。我们看目前这个流程,先执行in,再执行join in里边呢获取session,开启事务,里边提交事物,关闭session。那我现在。我在这个里边提交。事物。关闭,再我要这么一写的话,这个跟依你的那个。
04:05
能配得上吧,是吧,但地传里边没有配的了,我再让他配一个。三升等于。Satisfactory。Can open。Section等于。三点你看。八。这样的话呢,正好是两对,这个跟in那个配,这个跟那个配是吧。我把这个再改为Oracle。大家说现在这个情况下,还会发送那个update语吗?看数据表哈。嗯,是散没问题,这个时候还会发吗?找一个。我们看到是不是只有一个select啊。没有那个update吧。没有。
05:00
为什么没有?为什么我把这个去掉就有呢?去掉了就有。这个刚才我们已经测试过了。要是把这个。打开把这个改为散。他就没有什么感觉在呢。数据表里边这个已经发生变化了吗?刚才不是。这个时候就没有。为什么没有啊?我们看哈,我第一次获取这个对象呢,在前边这个session的缓存里边是吧,我这样一关的话,我这个对象已经不在这个缓存里边了,然后的话呢,我开了一个新的session,虽然说这个呃变量名一样,但它确实是一个新的对象哈,我开了一个新的session,我开了一个新的事物,这个时候我这个new的对象在不在这个缓存里边。不在吗?不在这个缓存里边,那你怎么变,我三人是不是感知不到啊。你怎么变跟我都没关系,所以说他不会去发那个。
06:04
Update语句发不了。怎么办呢?哎,这个时候我们需要显示的去调用那个session的update方法。那实际上。对于这个session而言,这个news对象已经是一个游离对象了吧?数据表里边有我对应的记录,我才获取的吗?但是我并不在session缓存里边,所以说这个对象称之为一个有理对象,那你要是更新一个有理对象的话,请显示的调用session的update方法。更新一个。有理对象。需要显示。要用。三的方法。看看。三点,Complete走一个。
07:06
看见了吧,这个时候会有这个update,哎,这就是update的用途。干这个用的,那它当然还有一个副作用,就是什么呀,可以把一个。游离对象。变为。持久化对象是这样吧。这个时候这一搞的话,那么这个对象又到三的缓存里边了。就是这个session的update的方法。诶。在什么时候不用,在什么时候用好了,我们看需要注意的点。第一个。大家来看我们这个方法。我现在呢,我把这61行去掉。
08:03
B我只是获取这个对象,然后把这个事物提交了,然后把赛生关了,然后我们对我才获取这个对象,原封不动的调一个update,这个时候还会发生update语句吗?找一个看看。刘,是不是有啊?看见了吧,即便是这个对象原封不动的话,我也会发送update,哎,这是一个问题说。无论。要更新的。有理对象和。触具。表的。地是否一致。都会发送update。
09:00
语句看到了吧,无论怎么样他都会发。那这个呢。跟我这个持久化对象就不一样,我把这个去掉。大家看,这是一个持久化对象,这个时候很明显它不会发出一个update语句。不会发吧,为什么呀,因为这个flash的时候啊,我会看,哎,数据表跟我缓存里边这个对象是不是一样的,一样的话。不发,不一样的我再发。这一条的话呢,就跟我们缓存里边的那个flash是不是更新就不一样了。我们想一下他为什么。即便是我不修改任何属性的话,他也会发这个update语句,为什么呀?想想。因为。这个session就是我新开这个session哈,这个session虽然跟以前这个session同名,但它确实是两个session,因为这个session并不知道数据库那个记录长什么样,那你给我传了一个news,我为了保证我这个update语句执行是有效的,我只能是发update,反正发肯定没问题,不发的话就可能有问题,于是的话呢,就会发这个update。
10:21
那其实发也没什么,但是在我们这个哈姆类跟触发器协同工作的话就有问题,因为我有可能有一个针对于阿一个触发器吧。我每发一个update,它就会触发那个。触发器,那这个时候的话呢,这个触发器可能就被错误的触发过很多次,这就是问题。那我如何能让?Update的方法,不盲目的。触发语句呢?如何能让?方法不再盲目的。
11:04
不发。It。雨娟呢?那就是在我。更新之前我得先查一下吧,哎。在更新之前先查一下,你就这样。在打HBM。2XM门店的。Glass节点设置一个属性叫。Select。Before。Update,等于two就可以了。过来调一下。Le before update。
12:01
来看。这种。这个时候呢,我们实际上是看看到两个查询,第一个查询这个,第二个就是在更新之前我还会再。查一次,这个时候是不是就不会触发,不会盲目的触发这个update语句了,OK,这是一个解决方案。好,默认为false。我们需要说一下。但通常。不需要设置该处境。除非你是跟触发器。机动工作的话,如果要是没有触发器的话,我们不需要设置它,因为设置这个。在需要更新的情况下,我就需要多发一条。Select语句。是吧?所以说这个效率的话呢,其实反倒变低了。第一个需要注意的。
13:02
二。第二个需要注意的就是。大家说我如果这个对象在数据库里边没有对应记录的话,他会怎么样?什么意思啊?比方说我临时把这个ID给改了,改成了100。这是可以的哈,因为这是一个有理对象,我可以改,这里面不能改的处理,我可以改,在这儿改吧。这样改就是一个有有理对象哦,我不归这个三生观,也不归这个三生观,我改没问题,找一个会怎么样。Oh。如果对一个。嗯,数据表里边不存在的对象,即它不是一个有理对象,调用update的方法的话,它会抛异常。数据。表中没有。
14:03
对应的记录。但还调用了object方法。抛出常。三个。我把这个去掉了哈。第三个呢,我们在前面提过这样的一件事。首先诶。这里边我来获取一个对象,News等于section.x。News。给class写一个一。对吧。然后啊,我把这个呢先拿掉,因为通常情况下我们不是不需要来设置它吗。
15:00
拿掉。这个时候呢,我要对这个news执行update,它会怎么样?同学说是刚刚好啊,你在更新之前。查了一遍是吧,找一个。怎么样?抛了一个异常,什么异常啊,叫non unique object exception,并不是唯一的对象的异常,看到了吧,并不是唯一的对象的异常。什么意思呢?我尝试着把这个游离对象纳到session里面,然后我执行一个更新,但是问题是我在纳入之前,我session里面是不是已经有一个ID是一的对象了呀?我们前面讲过。在同一时刻,就是在同一个三的生命周期里边,在同一个三身的缓存里边,不能够有两个ID相同的对象。
16:00
就是这样的一个问题。第三条。我直接来复制这个里边了哈。阿配的方法关联一个有理对象是,如果三身中。已经存在了。相同的OID的智化对象报异常。因为。塞身缓存中。不能有两个oid相同的对象。两个正正容OID对象的话,我更新的时候我以哪个为准呢。啊,不能够这样。这就是我们的update方法。我们首先呢,我们需要了解update的方法在什么时候用。然后的话呢,它有三点需要注意的。
17:01
下一个。这个方法名呢,叫save all update什么意思?保存或更新?什么时候执行这个保存,什么时候执行这个更新呢。判定标准时。这个对象的OI是不是空?就是说他要是一个临时对象的话,执行save,临时对象ID是空号游离对象的话,执行update。通常情况下,用这个oid是不是空就判断就可以了。极端情况我们可以来设置一个an save的Y流属性这个值,比方说我设为十,那么ID是十的话表示它,表示它是一个未被保存的啊,这个时候我们也认为它是一个临时对象。那这种情况的话呢,并不多见,一会儿我们举一个例子,大家看一下就可以。测试一下。
18:08
Save all up。具体的这个笔记呢,我就不写了哈,我们这里面写的很详细。创建一个对象。保存。要用save方法。按说这个时候应该执行什么操作呀。就保证还是更新呢。那是空嘛,这很明显是一个游离对象,所以说这个时候我应该执行。
19:06
Save。看见了吧,点。啊,进来了没问题。如果有ID呢?6.siteid是一。别抢。看。是不是执行一个update呀,这个时候把第一条记录更新了。FFFFF。这就是save or update,这里边儿有一个需要注意的点。B。第一个我们说如果有ID数据表里边还没有对应的记录的话,怎么办。
20:01
落啊。OID不为空。但数据表中。还没有。和其。对应的记录怎么办?这是一个之一来看。就是抛异常啊。会。抛出一个异常,因为我这个ID不是空,我就尝试执行一个update,你还没有的话。会场。第二点。OIV空的对象肯定是一个。有理对象,那实际上的话呢,我们还可以来设置。ID的an save的Y6属性,如果OID的值跟那个n save的Y流一致的话,Harm也认为它是一个有利对象,这个仅需要做一个了解就可以了。
21:05
了解内容啊。说。OID值。等于ID的。嗯。Saved。Y6属性,直岗下叶背。认为。是一个有理对象。嗯,也这样认为。过来。说一下。And value,我设为之一。回来刚才这个11执行的话呢,还出错带走。将会执行一条in色,看见了吧,但这个的话呢,呃,仅供一个了解。你把这个也去掉。
22:01
知道就可以了。以上就是我们的save or update。大家也可以来看一下这个PPT,我们这块还有一个图。三的末制方法。这个方法的话呢,我们看到有一个比较复杂的图。这个方法呀,比较复杂,也比较难学。但这个方法呢,在harmlet里边用的并不多,在GPA里边用的比较多,考虑到我们现在是初学哈,所以说这个方法我们暂时也不讲,讲GPA的时候我们会详细的来说这个方法。GPA的时候再见。下一个方法叫delete删除,可以删除一个有理对象,也可以删除一个持久化对象。测试一下。
23:04
要一个方法。行。删除操作说白了就是只要我这个IDID在数据库里边有一个对应的记录,我就我就删啊,只要。OI和数据表中的一条。记录背影改。就会准备执行。Delete操作。要是OI在数据表里面没有对应的记录呢?哇。YD在数据表中。没有对应的记录,则抛出异常。啊,我这个删除的话,我不管你是一个有理对象还是一个化对象,只要OI能对得上我就删,于是的话呢,我们来做一个。
24:09
测试大家看一看,我创建一个news等于new一个news。我只设一个ID。再点。这样就可以删,因为数据表里边。有,有一个ID是一的对象。删了。好了,这个的话呢,我们认为它就是一个有理对象吧。再来看一个19号对象。就点class。
25:00
是几呀?已经删除。问题。这应该是一个。持久化对象,我也可以进行删除。都没了哈,这两个。再有一个需要注意的就是,如果我创建了,如果有一个对象,但数据表里边并没有对应的记录,然后删的话,会抛出一个异常。刚才的话我们也提到了,所以说前面这些挺好理解,嗯,这来说一个。大家说这个的话呢,也挺好理解的,但是我们要明白为什么会有这样的一条。这个先拿掉,把这个打开。
26:00
布置一个ID过来。复制。放这。不知道这个时候的话呢,我会找到这个对象。帮我写一个。我已经删了哈。走。大家看这个过程来。我先进行get。然后的话呢。打印,然后执行删除,什么时候删的呀?啊,我是在flash缓存的时候删的,并不是马上删的啊,并不是调这个方法之后马上删的,这个只是计划执行一条update,那我删完之后的话是什么情况啊,这个对象还是有ID的。有ID的话,如果我要是后续还需要超重这个。对象的话就比较麻烦是吧,比方说我去对它叫save or update,它就会尝试执行一条update语句。
27:03
但是数据表里边没有对应的记录,就会抛异常,就是说我这个删除对象啊,就不能再用了。你也不行,你要是save吗?他有ID。所以说,肯定不能够对这样的对象执行save or update方法。那。我能不能我这样一删的话,把这个ID制空呢,它是一个删除的了啊,这是可以做到的。说啊。可以通过设置。配置。文件的一个属性也比较长啊,我复制一下这个属性为two。喂。指什么呢?指删除对象后把其OID置为。
28:12
闹,看到了吧。可以这么干,于是的话呢。看一下效果,这个刚才给你被删了哈,这搞一个CTRLC打过来。设置一下这个属性。Property。Use I did back。删除。对象后。只提OI。制为闹。不是。
29:01
找一个看一看。大家看我还没删呢,我只要调完这个方法的话,这个ID是不是就是空了呀,哎,就是这样的一个。属性。但这个属性的话呢,啊,我们只是这么说一下哈,开发的时候用的也并不是特别多。好,OK,以上我们就把塞里边常用的方法基本上说完了,我们回过头来再看这个图。我们看一下。我创建一个新的对象,如果要是不设ID的话,它确实是一个临时对象。我对这个临时对象执行save save of persist都会变为一个持久化对象。对吧,那我也可以直接叫get或load得到一个持续化对象。
30:03
我对持久化对象执行session.clear或者是session.close都会使它变为游离对象,这个我们来说一下,李忘说了。那我如果要是一个有理对象的话呢,我执行update或者是C,我update它就会变为一个持久化对象哦,我对持久化对象或有理对象调用delete,都会使它变为一个删除对象,整个就是这个流程。Evict是什么意思啊?从缓存中把这个对象移除。从。Oh。三生缓存中把指定的19化对象。
31:12
ER。这样说的话呢,操作起来方便一点哈。我们来获取两个对角。强者。二。我同时去修改他们的。一点就改什么呀,就改开头。一个呢,变成AA。一个呢,变成BB。看下数据表。
32:02
都不是A和BB哈,好。如果要是就这样完了的话,这两个是不是全改了呀,我在这块干一件事。单身条,我把NEWS1给一图,什么情况?啊,我在提交事务之前,我把这个对象从火龙里边移除了。那他这个他火车没有这个对象了,我就没法发那个update语句了吧。看一下。只有。两个select跟一个update。这个时候这个一呢,看不到更新。刷新看到了吧,哎,这就是我们的effect啊。从缓存中移除指定的持久化对象。OK,到这块的话呢,我们这个转换图就说完了,核心方法也说完了。
33:03
往后再看一个。要通过hamlet调用存储过程。Hamlet并没有提供原生的API。让。Harmonlet可以直接调用存储过程,怎么办呢?得拐个弯,先搞到connection。通过connection。Connection是原程的JDBC的这个API吧,是吧,通过connection像JDBC调存储过程那样去调存储过程,那如何得到这个connection呢?我们需要来调一个方法叫do。Session to work new work work是一个。接口这么搞的话是什么意思啊,是不是一个匿名类啊,Out,我搞一个connection搞一个。
34:14
看原生的connection买circle的吗?哎,我在这个里面调用存储过程。这个调用的方式呢。就跟我们用GDP调用方式就一样了,我们不重复说了。我们在讲GDP的时候讲过,大家要想看的话呢,看原来那个视频就可以了。那我们在进行一些批量操作的时候,哎,你也可以在这里边使用原生的connection。Hat与触发器协同工作。首先我们思考这样的一个问题哈。你说我跟触发器协同工作的话,可能会有什么问题。
35:00
第一个问题。如果我去调这个session update方法的话。默认情况下,只要我调这个update方法,它都会发出一个update语句吧,是吧,它就会盲目的触发。Update,而我刚好为这个update绑定了一个触发器,那个触发器是不是也会盲目的触发呀?啊,这是一个问题,这个问题的解决方案的话呢,我们前面提过,直接在class里边设一个比如update就可以了吧。这个时候就是说我设这个属性为处的话,我就不会。盲目的去触发这个update,我只有数据表里边那个记录跟我传进来的这个游离对象的这个状态不一样的话,我才会发,那你这个时候发update语句的话,我就应该触发触发器,所以说这个解决方案呢,就是啊,使用这个select before update,把这个值设为true就可以了。
36:03
我们再说一下啊,这个仅是在。呃,需要跟触发器协同工作的时候再设置,否则是不需要设置的。第二个问题。我们进行这个。Harm操作的时候啊,哎,触发器被触发了,触发器触发的时候呢,它是某一条对象的这个字段发生改变了,而我这个时候刚好在session里边有这个对象数据库里边改了session不知道。三感知不到,那塞里边这个对象的一个状态呢,还是以前的。那这个时候可能就会造成,呃,两边这个记录的信息不一致,我操作的时候呢,就可能出错。换句话说就是我30里边这个对象的状态并不是最新的,我如何能够让三神这个状态是最新的呀?啊,在我对他进行操作之前,我调一个。
37:02
Refresh方法。我马上再去查一条,查查一下这条记录,只要这个记录是新的就可以,所以说就是这个问题,就是这个问题的解决方案,以上的话呢,我们做一个了解就可以了哈,Net跟触发器协同工作。通过这样的方式进行解决。
我来说两句