00:00
下边呢,我们来说一下双向一对一的关联关系。我们直接讲双向的了哈,因为你掌握双向的哈,再去学习单向的就特别简单。这里边呢,多了一个注解,这个注解叫one to one OK,我们通过代码来说,首先我来新建两个类,这两个类呢,一个叫manager经理,一个叫department。部门,我们这里边儿这个业务关系就是一个部门只有一个经理。同样的,一个经理也只能管一个部门,这样的话就是一个双向一对一的关联关系,Ad部门的名称,部门的经理G。
01:05
ID。经理的名称。经理管的部门。G。好的,下面我们来看如何映射一对一的关联关系。首先加一个注解叫entity,对吧?再加一个注解叫table table指定表明GPA。Many。ID generated value组件生成方式。使用默认的方式可以不写吧,对吧,不写。再看一下manager name。
02:01
映射的列名应该叫MGRR_name好,比较关键的是这个什么呀,这个叫。部门儿。这个呢,就是我们要去映射这个一对一的关联关系,这个后边说现在我们再来看这个。Entity edge。Table name tpa departments。ID。Generated value使用默认的组件生成方式。An column组件的名称叫dept。Name,好的。为什么还会有错呢?因为我们没有把这个类填到我们的。
03:05
Persistence配置文件里面。Manager。好的,这个时候这个串呢,基本上就没有了,Ctrl shift o导进来。下面我们来映射这个双向一对一的关联关系,首先呢,我们讲的是基于外界映射的双向一对一关联关系,当然你也可以使用基于主见的,基于主键的呢,稍后我们会提一下,我们主要来讲这个基于外键的双向一对一关联关系,那首先需要思考的一个问题就是这个外键放在哪张表里边。实际上是什么呀,双向关联关系,放哪个里边都可以。双向一对一嘛,他俩是完全平等的,我们选择给它放在。
04:00
Department这个里边就是说这里边有一个外键指向MY的主键,于是过来看这个one to。一对一同时指定John column name组建的名字叫manager ID,同时它必须是什么呀?必须是有一个唯一约束是吧?OK。使用at one two one来映射一对一关联关系。若需要。在当前数据表中。添加主键则需要使用什么呀?At转column来进行映射,注意一对一关联关系,所以需要添加unix。
05:16
等于two,好了,这搞定,然后的话呢,到man里边来,我们再找到我们的department,加上一个什么呀,One twoone,我不维护关联关系,我不维护关联关系map by等于to。呃,不是to是吧,Map等于什么呀?使用对方的哪个属性。使用对方的哪一个属性来。维护关联关系呢?Department里边的manager刚才这样写,搞定是吧?说对于不维护关联关系,我们也可以说没有外键的一方使用one to one。
06:15
来进行。映射,然后呢,需要设置。Map。等于处,当然你也可以不设置,你要不设置的话怎么了,就两边都维护关联关系,它会。多出无谓的update语句,这个我们前面我们已经说过了是吧,这里边的话呢,我们不再做这样的演示,所以说应该是什么呀,建议设置这样说好一些是吧,诶建议设置map等于map by。等于处我们建议这样设置好了,这样的话呢,这个呃,配置就配置完了一边使用。
07:08
One two one同时使用,使用照用column来映射外键,那么映射外键的话,这一边就理所当然的成为了维护关系的一方,但是需要设一个UN等于处一对一的关联关系嘛,这个外键的值不能重复。而另外一方使用one two one就可以了。那通常情况下,我们建议使用map by,由对方来维护关联关系,而不是两方都维护关联关系,对吧,搞定。进行一个测试,Public void test one to one at test,我们先看生成的数据表,找一个。
08:04
好了,通过数据表。F5。Department。Department点开。Al,看一下外键没问题吧,那如何看那个唯一约束是加上了呢?唯一约束它会生成一个索引过来,加上了没问题是吧?回来,下面我们来执行一个添加的操作,添加首先我要写一个麦等于new麦种。manager.site。MA,然后我再写一个department等于6D pt.site d AA,设置关联关系M gr.site department。
09:05
D pt.site manager好了。执行保存操作。Persistence persistence。执行保存操作,我们注意这个保存有顺序吗?大家觉得呢,我们应该先保存。先保存不维护关联关系的一方吧。manager.process不保存关联关系的是。Manager manager.per CPT好了看效果,然后的话呢,我们来做,再做笔记找一个。添加肯定是可以。成功的过了,是不是这个时候只有两条insert?
10:00
近来。这个也进来,OKOK,我把这个顺序调一下,注意看我写成BB,这个我也写成BB,我先保存维护关联关系的一方,他会怎么样啊。我保存它的时候,这个时候manager那个主线是不是还没有啊,所以说这个时候会多出。Update。看效果。看见了吧,两条insert,一条update,这个值进来呢,是没有任何问题的,对吧,好了回来。做一个笔记说。双向一对一的关联关系,建议先保存。不维护关联关系的一方,即没有主,没有外键外键的一方,这样不会多出update。
11:15
宇宙能想明白吧?你看这个是没有那个外键的,而这个是有那个外键的,如果你要是先保存有外键的一方的话,那么。这个时候怎么了,这个时候你看我想插入这个外键值,这个值不是不是还没有呢呀,我在插入这个之后,我才有外键值吧,所以说就会多出update,如果你要是先保存不维护关联关系的一方,就是我们所谓的这个没有外键的一方,这个时候就不会多出update好了,这就是我们这块说的这个叫保存操作,再来看一个这操作完。To one find ADD test,我们再来看一下这个find操作,这个find操作呢,我们先来获取啊,我们先来获取维护关联关系的一方,比方说我搞搞这个department等于n manager.fan。
12:19
department.class1。第pt.department然后我想看看department关联的。Manager这个类是一个代理类呢,还是一个。真实的对象呢?找一个?哎哟。通过这个代码的话,我们看到一个问题,是个什么问题啊。他使用了啊。
13:00
主要链接吧,而且两个都获取了,我们看到了吗?诶两个都获取了,都是主外链接,那主要链接这个不怎么好,我们说默认情况下。第一种情况说,若获取。呃,维护。关联关系的一方则会通过左Y链接。获取其。关联的对象,我们不希望这样,能改吗?Department,我们过来看一眼,是有什么改来着。有个属性叫。Fetch,这个是可以取值为lazy,再看效果。大家看这个说什么了,是不是一条语句啊,这是一个代理吧,好了可以通过。
14:10
这样写。但。但可以通过。One one two one的fetch属性来修改加载策略是吧?好的,我们再来测试,第二个,我要是先来获取。不维护关联关系的一方呢?先会与谁呀?先来获取我们的manager等于ntt manager.find manager.class一点get name。
15:05
然后我sit out manager.get.get class.get name跟这个操作是对应的是吧,走一个看看。哎,它也是一个主要连接是吗。哎哟,但是这边啊,主要链接,所以说这块是个对象,是个全列名,没问题,好了过来也是这样的,默认情况下若获取不维护关联关系。的一方则也会通过主要链接获取其关联对象,那肯定也可以改呀,改谁改?Manager。改,Fge等于。Lay,好,再看效果。
16:04
诶,我们发现即便是改成lazy的话。他依然获取了其关联的department对象,看见了吗?过来过来。可以通过关。To win的fetch属性来修改。加载策略。但。但依然会发送circle语句来初始化。其关联的对象依然会再发送一条是吧?哎,这就说明我们改不改的意义是不大的,这说明在不维护关联关系的一方不建议。
17:09
设置。修改修改谁呀,修改这个fe属性是这样吗?这个时候我们不建议大家来修改这个属性,因为你要是改完之后的话,他是发两条色口,你不改的话是发一条色口,那肯定是两条还不跟一条吧。是这样吧。好的好的,那这块的话呢,我们要讲一下,他为什么一定要发circle去查我那个关联对象呢,你看这个就没发。老老老实实的只有一条语句,这个的话呢,无论你怎么改,它都是。两条。这是为什么呢?我们看一下我们的这个数据表,大家看哈,这个是维护关联关系的吧,是吧,主建债的一方啊,外建债的一方嘛,这个时候呢,实际上我根据这个外键值,这个值是不是空,我就知道我关联那个对象有没有吧。
18:14
如果我关联那个对象,要是没有的话,我返回那个值,就是我关联那个对象。它就是一个空对象,如果我关联那个对象要是存在的话,我关联那个对象我就给你搞一个代理,大家懂吧,就这个时候我总会非常妥当的去处理那个关联对象,要么是空,要么是一个代理。但是。这这个没有外界的这一方,就是说不维护关联关系这一方,你发现什么呀。你发现他没有外建,我不知道有没有我关联的那个对象是吧,所以说我没有办法给你搞代理,也没有办法给你搞一个空,那我只能是加查一条。懂这个意思吧,我必须去查,我要是不查的话,我不知道怎么去处理这个关联对象,搞一个代理吧,万一没有的话,不行,是空吧,有可能还有,所以说我必须得去查一下,那查的方式要么是主要链接,要么是额外发送一条这口语卷,清楚了吧。
19:19
这个呢,我们实际上在我们的这个PPT里边有写,大家也可以去参看一下好了,以上我们讲的是,呃,Persistence跟。更新和那个删除我就不讲了,这个跟我们前边一对多多对一的那个情况类似。好吧。做一个小结,这里面呢,实际上。我们讲的是一个基于外键映射的一对一关联关系,哎。我们要注意的是,你要确定是哪一方来维护关联关系,通常情况下,我们建议一方维护关联关系,然后呢,这个外键就在这一方。
20:04
设一个UN等于two就可以了,而这一方不维护关联关系,使用。Map by这个属性通常不建议设置。这是基于外间映射的一对一。基于主键映射的一对一可以使用这个注解at primary key。转column这个的话呢,就不讲了啊,大家如果感兴趣的话,可以去参看一下对应的文档。
我来说两句