00:00
我们来学习一下这个双向最多。首先需要明确。这个双向一对多和双向多对一是完全相同的两种平行,因为是双向的,所以说你从左往右看是一对多,从右往左看是不是多对一呀。一回事。预模型方面。在一的一端有对多的一端的一个集合的应用。在多的一端有对一的一端的一个应用,以这个卡跟order为例,卡会有一个访问order的一个集合,Order会有一个访问卡的一个变量。分析数据模型,数据库这个呢,和我们前面讲那个单项多对一是一样的,也是这样的一个外键。姑娘会问是吧?你这么如何搞成双向的呢,你这个一对多怎么来搞啊,他我们那种。
01:05
一会儿的话,我们通过代码进行说明。我把前面的这个包复制一份。双向的。首先我们来看一下这个卡。我只需要在里边加一个order的一个集合引用就可以了。在。等于六。提成对应的盖晒方法。实际上我在写这个。集合的时候呢,有两点需要注意的。
02:01
第一点和第二点,我们一会儿再说。这个图片。他已经有了哈。单元测试类就是放着,就是我们进行测试的时候呢,我们可以在这个地方去改。配置文件需要改,这个包不一样。聪明。我们在hale。这文件里边把这两个加起来。那前面这些的话呢,我放到这个。解,里面。
03:01
一会我只需要加上一个boss就可以了。OK。Allow other。看一下这配置文件。打开。先看应该叫多对一,这个没变,还是这样。看这个一对多的。下面我们来映射啊。怎么样?一对多的那个集合属性有没有手。Customer。里边会有一个集合叫。Orders。有没有这样说,直接写一个one to many,没有那一项大家看见了吧?用那一项,那它是一个集合写成一个。
04:00
Said。名字叫。Orders。保存。这块的话呢,画一条线说。没有写完,有问题。什么问题呢?我们想哈,我说我一个卡有多个order,这个时候。我一个customer多个,那我一条customer记录可能对应着多条order记录,你说那个order。放在哪儿啊?奥能跟卡放一张表里边吗?看这。Please。我有很多凹凹放哪儿啊?就放这个表里边儿。是吧,所以说你需要告诉我放在哪张表里边,而且。放这张表里边儿那个关联的外殿是什么,对吧。
05:00
所以说你需要告诉我放那个表名叫什么,叫什么呀。像。写错了,跟这个table一样。而且那个表里那条记录,哪一条是跟我对应的呀,我需要写上一个外建,外建名column拢意志。这个里边的这个泡龙一致。当然,你还需要告诉我。我那个。映射的类型,关键这个类型是个什么类型,是一个one to。Money,因为money同也是用赛来运行,是写一个plus。把这个拿前面去。CTRLX打小。Package。写成。好的,这样的话呢,就映射完了。
06:00
前面这个我给他删除。下边呢,眼睛测试。找到那个text。我们还是来先看这个。添加。现在改一下,改成AA。一。二双向关联关系,我们应该写成。Get out。ADD。一再来一个二。下边我们来执行这个保存操作。这个呢,先拿掉吧。
07:06
你打开OK来看,这个时候的话呢,我也来先保存A,再保存auto是一个双向关联关系。好了。大家说这个时候会发一条这个语句。前面那个是不是发了三条啊,我们希望这个也发三条。是这样吗?找一个吧。看见了,貌似有update。看看吧。233个,INSERT2个。I。结果进来了吗?F。Order结果没问题,但是的话呢,这个时候多发了两条update。
08:14
为什么呀?为什么呀?难道我先存后存卡吗?A交织吗?六。他觉得呢。够呛是吧,刚才单向的时候这个都多出俩来,这双向的话不都是四个了呀。是不是这样呢,看看哈。一笔就能写。三。四。这种。首先确定进来了没问题。哦,一个两个三个四个是不是四个update呀,三个in third这个更朝代啊哎。
09:09
这个时候是先。插入再插入。是三条色。四条。Update。这样的一个人,光。好了,我们需要研究一下,为什么会多了这么多update呢?先看第一种情况。第一种情况的话呢,我在保存customer的时候,我在插入order,我们知道这个时候插入order的话怎么了,这customer ID是不是已经有了呀。那他就是把那个ID也插进去了,所以说应该是三条眼线就足够了吧。对吧。
10:01
但是还多出两条update,为什么呢?因为。默认情况下,我。B的一端多的一端是不不维护这个关联关系啊。对吧,我现在的话呢,我仅是在查插入多的一端的时候,多的一端说哎,把我这个卡ID发在了我这个关联关系维护完了,一的一端还得维护呢,另一端看。我查完了哈,我再检查一遍,你都看好了吗?于是他会多发两条,也是因为。因为什么呀,因为。一的一端。和多的一对。O维护。关联关系,所以说你多出两条。
11:00
所以。会多出update,那这个是四条的话,那个解释是一样的,因为本身你先插入order,再插卡会多两条,现在的话呢,这个卡还维护关联关系,不多两条字条。所以说我们用一个数字就可以了哈。嗯,因为E的一端。也维护关联关系。所以说就会多出。两条update,那要是希望他不多这个update怎么办呢?就是IT1不维护关联关系不就好了吗?D。我们可以来设定S元素的研模。What什么意思啊?很准。
12:00
反转说,哈姆里边,我们可以通过引入的处境来决定双向关联由哪一方来维护。关联关系以为false为主动方,以卧为处为被动方,主动方来负责维护关联关系,在没有设置影bos这个情况下。两边都维护关联关系,在双向一对多关联关系里边。啊,N的一方。设置为主控方有助于性能的改善,为什么?比方说。对。嗯,我们国家我们都知道啊,七大的。是我们的国家主席、军委主席。党的总书记。我们都知道习大大,习大大去吃包子了是吧,那习大大呢,可能不能够叫出我们每一个人的名字,我们整个这个叫什么,叫人民是吧。但是他不知道每个人都叫什么。
13:00
所以说维护这个关联关系的话,怎么维护啊,有多的一方维护,你让其他的有13亿这个中国人民的名字,这个非常不现实。所以说呢,我们怎么样呢,我们让。一的一端放弃维护关联关系,找找一的一端放弃维护关联关系,嗯,Worth等于。处反转给你吧。看。五。六爱强。设定了in之后的情况。把这个打开。走。是不是没有那个update了,哎,通过这样的方式可以帮我们解决这个问题说。
14:02
可以。在。一的一端吧。集合映射。你的一端的节点。节点。指定。引was等于不来使。一的一端放弃,维护关联关系就可以了啊,在这种情况下,我们还是建议大家先插入一的一端,后插入多的一端,减少update的。建议设定。
15:01
In等于。设定。建议先插入。一的一段后插入多的一段。好处就是。不会多出任何一条。好处是。不会。播出。UPDATE1句,看见了吧,就是。反转。维护关联关系的控制方向,你管我不管了。继续看吧,在这个里边的话呢,实际上我们还能看出一点来,就是说我们,哎针对关联关系的时候,你看是不是get order爱呀,这个时候这个get orders。
16:04
Order是什么东西啊?是不是这个集合呀,所以说我在设定这个集合的时候啊,我需要把这个集合进行初始化,一定初始化的话,它不会发生空指针异常的问题。需要。集合。进行。无纸化。可以防止。发生空指跟厂。来这块的话呢,我们关于双向一对多的这个保存操作。50万。再往上。我们来说一下。双向一对多的这个获取操作。
17:05
刚才呢,先查多的一端,再查一的一端,这个我们已经说完了,这个是一样的,我们现在看先查一的一端,再查多的一端,怎么样,就是我们另起一个方法。One。Money。But that。At test。瞧瞧,我先来搞一个卡。等于。再整点bag啊。Cardian bla。D。打印一个。customer.get cut STEM。
18:00
搞一搞。大家看,这不只查了卡尔,没有去查al。这个实际上我们已经能开出来了是吧。一点。播。多的一端的集合使用。延迟下载。是吧,你用的时候我在加载。那打一下吧,大图摸点get。是个啥东西嘞。走。大家看是不是哈姆内特内置的一个集合类型啊?注意哈,这个是哈姆内置的一个集合类型二。哎。返回的多的一端的集合是。
19:04
Hamlet内置的。集合类型是。该类型具有。延迟加载和。存放爱理对象的。功能看到了吧,哎,这是一个集合类型,那个集合类型呢。是一个类哈,它是我们,嗯上网SE里边那个接口的一个实现类。要出的第二个问题在这儿呢?第一个问题在这儿呢?说声明集合类型时。只用。接口类型。因为hamlet在获取。
20:07
集合类型时。返回的是。Hiber内置的。集合类行,而不是。Java SE一个标准的一个事线,看到了吧,这块的话呢,你要写size,你不能写哈西赛,写哈西赛的话,这就附不上了,没有那个父子关系。再回来。嗯,就是这个问题八。嗯。第三个问题啊,当然跟刚才那个差不多是吧,啊,他可能也会发生。懒加载的问题。可能会发生。
21:04
可能会抛出big异常。什么时候跑啊?再点close的手就跑。我打印一个吧。发点get。Order size这个时候的话呢,就会发生这个异常。哎。懒,加载一场没问题。那第四个。什么时候初始化呀?在。需要使用集合中元素的时候进行初始化,后边的话我们还会讲到还有一种叫。
22:09
增强的板加载,哎,后边我们再说,就是说我即便是获取这个size的时候啊,它也有可能不对集合进行复制化而直接发生,而直接发生一个矿态宇宙。后边再说。那关于获取这块的话呢,我们就需要注意这样的四点。这个呢,跟我们前面讲这个多对一的时候,实际上也是一致的,只不过一个是引用,一个是集合的引用,都是有一个蓝加载这样的一个效果,那这块的话呢,我们就把这个卡,我在说明这个集合类型的时候需要注意的两个点说清楚了。第一个必须得是一个接口类型。第二个啊,我们应该对它进行初始化,防止发生控制异常。
23:02
下边我们再来看这个。修改操作,这个修改操作吧,没啥需要说的。A world testic two吧。我们来搞一个卡。等于section点点CLASS1。看着哈么点get order.great.next.set order随便一个。D。BD。At test。好。可以改,没问题,发了一个update,看一下哪个改了。
24:01
改了吧。我们这个set是没有顺序的哈,并不是意味着他一定要改第一个对吧。删除呢,实际上跟这个删除的效果是一样的,不设置节点属性的话,也不能这样直接删,一会儿的话,我们会讲这个几点属性的问题。啊,这就是我们在讲双向一对多这块的这个增商改查需要注意的一些点。我们回过头来看一下这个PPT。往前看。这一页刚才说完了哈。这是我们说在19化类中定义集合属性的时候,必须把这个属性定义为Java的接口类型。两点是吧。哈姆内置的集合类具有集合代理功能,它支持延迟检索,就是说我实际上我在为这个集合赋值的时候,负的是谁啊?负的是哈类的内置的一个集合类,而并不是Java里边一个集合类的准标准实现,你为了让这个能够负的上,能够兼容的话,所以说我们来声明的时候,应该说明一个低口类型,说明一个哈set,哈set他面那块perist set它俩是分裂的。
25:22
不上。因为这个集合类型的时候呢,我们通常需要一起进行初始化这块,这个是吧。这样的话呢,我们在设定关联关系的时候,就不会发生这个控制这异常的问题。装项一对多我们用的是在这里边,我们还需要对。这个来进行一个比较详细的解释。刚才我们在这个写的时候的话呢,我们这个table啊,包括T呀,我们有这样的一个对应关系,我们来看一下这个对应关系。
26:02
It are?这样的一个图大家看。Class就是order order里边会有一个后对一,大家看到了吧,Order,然后我这块我设定的是custom custom,而我在一对多里面设定这个size的时候,这个给。必须是。多对一那个多的那个table,因为我一对多这个多存哪了呀,我存到这个数据表里边。然后说我在那个表里边,哪个跟我外界相搭呀,啊ID你要是不一致的话,那你就可能看到啊,多出一列啊,或者是把这个对象存到一个看的表里边啊,啊那时我们不希望看到它有这样的一个对应关系。这个呢,我们来写一下。
27:02
That。映射set类型的。普京。黑属性什么呀说。中的元素。对应的。记录。放在哪一个数据表中是吧说。栽植需要和。播。对一的。多的那个。表的名字一致。跟谁一致啊?跟多对一的多的这个表。看到了吧。好,里边key。
28:02
T呢,是指定。多的。表。中的外电列。WHY?见列啊,名字你告诉我哪个是外键列呀?要不的话,我在里边有那条记录,哪个是跟我对应的呀,先点这个是指定。就这类型。指定映射啊。背景工作的哦。Plus这个类型是order,就是这个one to many也是一个类型,告诉我是一对多,因为我们多对多的话呢,我们也是用that,也是用D,这个时候多多里边我们用的是。Money to many。OK,以上的话呢,就是我们说的这个叫双向对多。
29:00
下面要再讲的话呢,我们会。再来说一下这个ins以及A。还有。Order by,第三个呢,实际上都是在这个节点的处境。
我来说两句