00:00
下边呢,我们来看这个墨方法,这个相对而言要复杂一些。它实际上类似于harmon里边section那个save or update,但是过程比那个要复杂。我们首先看第一种情况,如果传入这个对象要是一个临时对象的话。那么他会先创建一个。新的对象。然后把临时对象的状态复制到那个新的对象里面,然然后对那个新的对象进行insert。然后返回那个新的对象。看第一种情况。在这儿。Test我们说呀,总的来说类似于。
01:05
Harmon session的save包。Update,方法好,第一种情况。若传入的是一个。临时对象,好,我来创建一个卡。点set edge 18。你怎么是不是都是new date呀?这样写方便,要不的话你不还得转吗?对吧?Set time new date.site cc163.com c.site。
02:18
Name CC,好的,注意没有ID,这是一个临时对象,现在呢,我要对它执行默方法。Entity manager点。传入卡,它还会返回一个卡。好的,底下看customer.get。ID再看STEMID来。这是K的ID。
03:05
而这个是customer two的ID,好找一个看效果。哎。我们看到这个测试呢是通过的,同时看customer对象怎么了,ID是空吧,Customer to这个对象的ID是三。插入肯定是成功的,我看一眼这个。进来没问题是吧,CC,好了,那我们回来,我们给大家来做一个这个,呃,笔记,它是这个意思,这是一个对象是吧,他要对这个临时对象进行默操作的话,那么他先创建了一个对象。新对象customer,我们这里边的名呢叫。Cat two。
04:00
然后呢,他对这个customer to进行in色的操作。然后当然会赋予ID了,是吧,这个时候它会有一个ID,但是customer没有看到了吧,笔记写一下说。会创建一个新的对象。把临时对象的属性复制到新的对象中,然后对新的对象执行。Insert持久化操作吧,是吧。持久化操作。所以。新的对象中有ID,但以前的临时对象中没有ID,看见了吧,诶。
05:14
这就是第一种情况,传入的是一个临时对象,它不对这个临时对象进行insert,而而是新创建了一个对象,然后呢,把临时对象的属性复制到那个新创建的对象里边,我们这里边就customer to,然后对这个对象进行insert。说白了就是把这个对象有那个临时状态变为了持久化状态,所以说customer to,你能够获取到ID,但是customer没有。看见了吧,诶这就是我们的第一种情况,第一种情况我们看这个图的话,是从这儿到这儿到这儿。第二种情况。如果这个时候这个news是一个游离对象的话,说白了就是有ID。
06:07
说白了就是有ID,这个时候的话呢,我要看数据库里边有没有对应的记录,如果要是没有对应记录的话,它也将执行一条insert。从这。到这缓存中没有哈,有理对象,然后呢,数据库里边也没有,这个时候它也会创建一个新的对象。然后把当前游离对象的这个属性复制到新的对象里边,然后尝试着对新对象进行insert。看第二种情况。TXT墨纸。Two eight test。这个呢,就用它了,CTRLCCTRLVCL.set ID,我写个100。
07:02
呃,滴滴吧。好的,然后我们再执行这个操作。先看效果。测试通过,我们看卡的这个主键还是100吧,这块设的,显然这个对象没有被持久化。如果它要变成一个持久化状态的话,ID不可能是100了吧,而变成持久化的这个是几啊,是四这个对象是可以进的来的。这是我们说的第二种情况,说一下哈,说若传入的是一个游离。对象G传入的对象有OID对吧,如果传的对象要是有OI的话,那么。
08:06
那么。第一种情况,我们先需要判断一下。在。若在ntt manager缓存中没有该对象。二落在数据库中。也没有对应的记录三。GPA会创建一个新的对象。然后把当前游离对象。的属性。复制到。
09:01
复制到新。创建的对象中第四步对新的对象执行insert操作,看到了吧,哎。这就是这种情况,这个时候找的这个汁儿呢,是从这儿。到这儿到这儿到这儿到这儿看到了吧。下边。我们再看另外一个分支,另外一个分支就是说缓存中有对应的记录呢。CTRLC过来。看着哈。把这个往前一点儿。都往前。改成。三。AUID缓存里边没有,数据库里边有对应的记录,则。
10:06
GPA会怎么样?会查询对应的。记录,则GPA会查会查这个记录,然后呢。然后返回该记录对应的对象,再然后。会把啊。游离对象游离对象。的属性复制到。查询到的对象中,然后干什么呀?然后对这个查询到的对象执行update。
11:07
什么意思呢?我来设置一个ID,这个ID呢写成四。对四哈,没有五。四这个啊,我改成一这些改成一看流程,那这个时候看这个呀,已经看不出来了,那还怎么样能把这个流程的这个效果给看出来呢。我们首先这块的话呢,我可以打印一下跟是不是同一个对象,很显然这块应该怎么样,应该不是吧,是吧,不是,然后呢,诶我们给这个cut的这个set。比方说set last name,我们来设置一个断点,我们通过debug的方式看这个方法被被调了几次,对吧,被吊几次啊,第一次。
12:04
第一次是我这块拗的时候会被掉一次。是吧,第二次。ID4数据库里边有对应的。记录注意这个是DD哈,这个时候查询的时候还会有一次。这是第二次,第三次。在我把查询,呃,在我把这个游离对象这个意E属性last name不是意E嘛,是吧,把这个意义属性复制到查询那个里边的话呢,又掉了一次,所以说这个方法会被掉三次,我们再结合那个circle口就能够看到这个效果。Debug。走起。走。哎,这个时候呢,这个值是几啊。意义看见了吧,哎,这个值是这个时候这个值是意义没问题,这是我们第一次什么,我们第一次new的时候搞的,嗯。
13:06
周六的时候搞的吗?好了。再来第二次呢,是查询的这个值实际上应该是DD对吧。再来第三次是复制的,以前这个值是DD,复制这个值是E,改了吧。然后会有一条update。回来再看circle。你看。一定是有一条select,然后有一条update,是不是见证了我们刚才说的这个整个流程啊。见证了吧,这个时候这个路线是这样,从这。到这儿。到这儿到这儿到这儿到这儿看到了吧,诶这样的一条线,你可以来结合我这个图再看一下好了。还有一种情况,第四种情况public test4第四种情况呢,是这个意思。
14:12
CTRLCCTRLC怎么了?他说呀。在缓存中有。对应的对象好了,要是有的话,这就不用了是吧,缓存里边有。定的对象,然后呢,GPA会把。游离对象的属性复制到。NTT活动对象是吧?复制到。NTT缓存中的对象中。然后我们对。Nt manager缓存中的对象执行update这个效果吧,OK,我们看一下。
15:13
这个应该是二,这个应该是三,对吧,好了。现在呢,我再把这个程序给它复制过来。CTRLC。同学说这个你怎你怎么看效果呀。这个呢,我明天一点点来哈,我首先呢,我获取一个对象。这样来。Entity manager。点。Fan。他他妈。点class这个只改为四对吧。然后。我对。
16:01
Entity manager默,我对谁进行默啊,对customer进行默是吧?现在显然呢,这两个对象不是同一个对象。就是说这个不等这是定型的了是吧,但是啊,我得把这个给它改一下,这个已经改成E了,我得给它改成DD。哎,我们现在我们考虑一下,我们如何才能验证出我们这这样的一个流程。实际上这个整个的流程呢,跟这个流程是一致的是吧,这个只不过我们没有进行获取,而是JP根据这个末制方法去获取的,所以说这个整个的这个流程效果呀,和这个几乎一样,我们靠打断点出不来。但是我们可以通过它去对比。hamlet能出来。我们首先看这个效果行不行。
17:05
诶,大家看到这个的确是被修改了是吧,那实际上它跟那个。它跟那个harmlet,那个save update有什么区别呢?区别是哎,我这是一个有理对象,那我在。我在第51行,我实际上我跟entity manager关联的还有一个持久化对象,他们的ID是。一样的。这个时候呢,我能对这个对象进行默GE,我里边有一个复制的操作,而hat。这个是行不通的,为什么呀,Harmlet不允许。Hart不允许session在同一个时刻跟两个ID相同的对象进行关联。
18:01
是吧?对于hale而言,这块我可能是有一个对象是四了。啊,我已经关联了,然后harmlet执行save update的时候,它将把这个临时对,这不应该就临时对象是吧,将把这个有理对象也纳入到缓存中,这个时候在同一时刻。Session同时跟两个ID相同的对象关联,Harmlet不可能,当然GPA也不可能,但是机制不一样嘛。实际上n dt manager始终都跟一个ID。就是一个ID是四的对象进行关联是吧。但是这里边有一个复制的操作,我们再来看一下harm里边这个操作,我们找到save or update。在这儿。我们需要看a person。我写一个一。我写一个一,然后呢,我在这一步我关联一个对象session.get person.CLASS1好的,如果我把这行去掉的话,那那这个时候它一定会发一个什么呀,Update吧。
19:14
走一个。发update没有成功,看一眼person。哦,让我给删了是吧。让我给删了,一进来写个AA保存。再来。看到了吧,这个时候这个操作实际上是成功了,直接是一条update,我现在把这个打开。打开了哈。我们看,呃,刚才这个已经改了,打开,打开之后的话呢,你再看是个什么情况。走。
20:02
失败了吧?为什么呀,叫。Non unique object exception,就是说这个时候啊,Session同时跟两个ID是一的对象进行关联了。看到了吧,而在GPA里边没有这个问题,因为它里边有一个复制的操作。好,以上的话呢,就是我们讲的关于墨指这个方法的四种行为,第一种行为。如果是个临时对象的话。如果传入那个参数是一个临时对象的话,那么它将创建一个新的对象,然后把那个临时对象的属性复制过来,对那个新的对象进行持久化操作。第二种,如果传入的这个对象是一个有ID的,他会先看缓存里边有没有,如果缓存里边没有,数据库里边也没有的话,那么他也将创建一个新的对象,然后把属性进行复制,对新对象尝试进行insert。
21:11
第三种情况,缓存里边没有传入的,还是有ID的那个对象,但数据库里边有。这个时候呢,他会先把数据库里边那个对象查出来,然后把缓存,然后把那个游离对象的属性复制到。新查的那个对象里面,然后对新查那个对象进行update。好,最后一种情况呢,实际上跟我们刚才说的倒数第二种情况有点类似,最后一种情况是我们啊手工的查了一下。而。倒数第二种情况,我是用墨纸查的是吧?呃,这两种情况是相类似的,但是我们要是跟harmlet对比的话,也能够看到一个不同,Harmlet类似于这样的操作,操作失败。harmlet里边它是session,不能跟两个对象啊,两个ID相同对象同时关联,而在GPA里边的话,因为它是一个复制的状态,所以说nd manager始终是跟一个对象关联。
22:18
看到了吧,好了,这是我们GP里边这个末制方法。当然这个方法也比较磨叽啊,大家需要认真的去看一下。
我来说两句