00:00
前面我们已经非常详细的讨论过一对多以及多对一的关联关系啊,有单向的,有双向的,我们说那个是开发里边非常常用的一种关联关系,那实际上。一对一,以及后面学的这个多对多关联关系也是开发的时候比较常用的,我们先来看这个。一对一关联关系。我们举这样的一个例子哈,部门到部门经理。说一个部门只能有一个部门经理,反过来一个部门经理也只能去管一个部门,这样不就是一个一对一的关联关系吗?我们直接来说这个双向的一对一关联关系,单向的是不是一边一取消就可以了。双向的。Department里边有一个manager的一个引用。对应的里边也有一个department,一个引用。这就是我们的预模型。
01:01
关系数据模型有两种映射方式,一个是按外间映射,一个是按主键映射,先看这个按外间映射。按外界映射。这个类似于那个多对一。我们看哈,我这个映射的话呢,我相当于是在这个department表里边加上一个mind ID,它引用mind表的这个ID作为再见。那这个就是我们前面讨论那个多对一,这岂不是多个部门可以对应一个manager了吗?呃,别着急。我让这个外键加上一个unique,加上一个唯一约束,这个时候怎么了,这个时候这个外键是不是不能重啊。以这样的方式实现了一对一。懂这个意思了吧?就是说我的确是有这样的一个外建,但是我给这个外建加上了一个唯一约束,这就导致着,哎,我一个部门只能指向一个外卖者,那我下一个部门我再不能够指向前面已经用的买卖者了,对吧,我只能指向一个新的买卖者,于是一对一。
02:12
好,我们先看这个基于外径映射如何来进行映射,以及呢,我们给它进行测试。新建一个harmony的工厂。包呢,直接复制了哈。配置文件就复制了。加道拉下。看一下配置文件。这个是用那个C3P0数据源的,对吧。
03:03
我们把这些mapping给它去掉。我们来写预模型。不看我们现在我们是基于快捷的方式啊。低于。外进的方式。电视delay第一个叫manager。还有一个叫department。ID。
04:00
部门的名称。关联对应的方法。I。名字。关联的department赛方法。下面我们来用hat插件生成对应的hbi文件。Finish。但是需要改一下哈,看一下把这打开。
05:03
类名,Managers。I。Video。这样解。被个肩掉。Department。Department。改为内加一个。下划线。Department。把这个也先去掉。下面呢,我们就通过外电的方式来映射这个一对一。首先要想。那个外键放哪个里边,我们选择把这个外键呢,放在这个department对应的数据表里边,哎,使用。
06:08
图案。的方式来映设利益关联关系。把many to one放在这个里边呢,我们就会在这个表里边生成一个外键,对吧?来,Many to one name。Manager。Class。Manager。下一个polo。ID。别忘了需要加一个哦。被约束unique。这个值是。
07:00
保存。上映射呢就完事了,而我在这张表里边。嗯。映设一对一的关联关系,需要注意的是,我在这个表里边啊,已经加了这个外点,这个表里边我们就使用one to one来进行映射。说在。对应的。数据表中已经有。外界了。当前。持久花类持久啊对,使用安。屋干定型六兽。One two one名字。
08:01
Plus。Department。没能够提示,嗯。Department,没有的话,那我们就自己写吧,写一个全类名。完事。加到我们的这个哈,配置文件里边。Mapping。就这。下边的一个叫manager点。谢谢。在线。见。姐姐,下一个这个叫。
09:05
Department。新建单元车之类,单元车之类呢,和前面这个差不多。我们给它复制过来。Lucy。哪块差不多呀。是不都需要用用这个factor session跟呢。一。电子里边是好用的。本周1UNIT。啊。Gift。嗯,后边的干将。我们生成对应的数据表。找一个。出错了,他说什么?
10:02
没找着这个文件,嗯。Come at,硅谷hamlet one to one。Manager。Department。他说没找着这个manager写错了吧,看一下。XML不是XLM。XL。这种。看数据表。刷新。Department。Department,看一下out。未见。Mind ID指向麦表的这个主键没问题。
11:05
违约数呢?Index mind ID有一位约束,OK。好,回来吧。下面的话呢,我们来进行这个增删改查操作看一下。第一个,一个save,先新建一个department。等于。You。Department department。待新建一个manager。等于六。Manager manager.set manager name写D。
12:03
AA下边设定关联关系。点一个department that manager。卖那种。Manager said department department。保存操作。三声点save。Manager。3.apartment,哦,一个小小。大家看。抒发了两个circle。数据表。没问题。这样这个保存呢,就说白了。大家会有什么想法吗?会有吗?想法是如果把这个顺序调一下,还会多出update吗?
13:05
他觉得会不会多呀。会不会多呀?BB。BB找一个瞧瞧。是不是多了一个update呀?哎,多这个update跟我们前面来讲多对一的时候多了个update的道理是一样的。为什么?因为我先保存的department,这个时候这还没有manager ID呢,对吧,我只有在把manager保存过去之后,然后的话呢,哈布再来更新这个数据表来维护这个。Mind ID对吧。这个道理呢,我们前面讲的是一样的,所以说我们直接说结论了哈,建议。先保存。没有。外渐变的一个对象。这样会。
14:06
减少。Up。一句哭了。这就是。添加。单片的来看。查询,在查询的时候,我们会发现我目前这个映射有问题。Public world test guide。我们先来查department。DPD等于三点。Department class。打印一下一批地点,Get part name先走一个。
15:00
大家看,哎,我查的就是department,没啥问题。但是我们从这里面能能看到什么呀,能看到还是使用了那个叫懒加载是吧,我并没有把我这个department关联的man也查出来。这个的话呢,跟我们前面讲的一样,默认情况下。对关联属性。使用俺。加载,那么对应的懒加载的一些这个相关的问题会有,比方说它会出现这个懒加载异常,还记得吧。第二个,所以。会出现晚加载异常的问题,什么时候出啊?如果你这块把三身关了的话。三身点close,然后呢,我还要得我的麦。
16:10
我先介绍那个点,爱他。这个时候会出吗?会吗?有一个。哎,这个时候没出。异常在哪儿出的这个异常。这异常在这儿出的。说我们不能够操作一个已经关闭的connection,因为我这块关了嘛。前面这块没关吗?那前面这块又关了吗。二的问题。这个是没问题的,我们这边已经详细的说过了哈,因为你只是想打一下这个class的话没问题,但是如果你需要用到艾米格的处境的时候怎么了?这个时候会出一招又说什么了,这是一个代理代理对象,我这块的话呢,想对这个代理对象进行初始化。
17:05
跑一场。看一看,就是那个著名的。揽加赛一场。对吧,OK,这个问题的话呢,我们讨论完了。不聊了哈。拿来。这是我们说的那个问题。把这个呢,我们打开。在下面我真的来查询一下。等于e pd.get manager,而且打印一下点get manager game OK,我们要好好瞧一瞧。怎么样?有一个。看见什么问题啊。
18:00
这是我查的啊。Department前面的哈,诶后边我查manager的时候,我们发现一个什么呀。他用的是叫。左外链接看见了吧。第一为什么主外链接,第二这个主要链接这个连接条件对吗。什么?Mind ID等于department ID连接条件不对吧?连条应该是什么呀?Mind ID应该是mind表的mindd等于department表的mind ID吧,应该这样连说这个连接条件也。有问题我们先来说第二个问题,第一个问题的话呢,我们一会再说,来来。说。查询。Manage对象的连接条件。应该是是什么呀,是M表的,那这么说啊,EPP的MAD等于M的MID对吧,而不应该。
19:12
是目前这个怎么写的。是。De PT的DEPT等于。Man。这个很明显是有问题的。是因为我们在映射的时候啊。嗯,少用用了一个属性。我们找到我们的这个。Manager。在这儿。再瞧我们这个条件啊,条件你看我说我这些映射的时候呢,我应该用的是。一个外键,而不是一个主键,这个是。
20:02
Manager啊,有一个dept,我指定一个哈,我指定一个property reference,我先写上它。叫manager这样再走。按一下。这个连接条件。是不对了呀。Mind I mind I。为什么这样你就好用了呀。我们起作用的主要是我们配了这样的一个属性,对吧。这个属性什么意思?说呀。呃,没有这个属性的话呢,我在进行关联的时候。我就使用。De PT的组件进行关联,你看以前是dept的DEPTD属性。如果我配了一个property reference的话,我就使用。DPT。
21:02
MGRR对应的这个列作为连接条件,听清了吗?说如果我要是加了这个属性的话,我就用deptm grr这一列。呃,Deptm grr这个字段所对应那个列作为连接条件,于是的话,我们就看到了,啊,MGR所对应那个列叫mind ID,于是这个连接就。正确了。写笔记。这一下里边有。说没有快进的一段。没有外键的一端需要使用半图外元素进行映射,该元素使用property reference属性指定,使用关联实体主键以外的字段作为关联字段。
22:09
这个意义呢非常的重要,如果没有它的话,就用那个主键关联,这个结果是错误的。同学说老师我这个接口刚好对呀,是这是因为我这里边没有多余的记录,有多余的,有多余的记录的话就不行了,是吧。啊,我们说了这个问题,下面我们来说另外一个问题。在这里边我们来说这个问题。再测试一个get。Public,我现在呢,我来直接获取manager等于。三点。强转。He thought manager get get manager name。
23:03
爱的找一个。哎。查了一个结果,你发现什么呀?他并不是单纯的查的这个manager吧,是不是用一个左边链接把这个department的也查出来了呀。看点that department.that department name有一个。哎。我在查这个manager的时候,用一个主外链接把它关联的department也查出来了。为什么?这是哈林内制的啊,我们来探讨一下为什么?大家想。我这个manager吧,就是一张这样的表,我从这个里边是不是不知道。
24:00
哪一个department跟我关联呢?是吧,哎,我从这个里边,我不知道哪一个department跟我关联,那我如果仅是查了一个manager,那我下一步我如何获取跟我关联的那个department。你不像说我要是查一个department,我在知道manager没问题,因为department里边有idea。那我现在我要只查了一个manager,我怎么知道。那一张表里边儿谁跟我关联呢?当然我们在circle里边的话呢,我们说哦,我拿那个mad ID去查就可以了,但那harm里边不行,他必须得在查完这个之后,我得知道啊,那个表里边谁跟我关联,于是的话呢,他这块用了一个。主外连接。看到了吧。行这块的话呢,我们了解一下就可以了,大家知道啊,我在查询,我们说一下啊,在。查询。
25:02
没有外建的。实体对象是使用的是。国外链接。一并查出。查询出其关联的。一下病已经。进行初始化,看到了吧。这里。OK,以上呢,就是我们讲到的一对一关联的第一种方式。再看一下PPT,做一个小结。说。对于基于外键的一对一,其外键可以放在任意一端,你放在manager里边可以,你放在department也可,也可以在需要存放外键的一端增加many to one元素,但我们需要为这个many to one元素增加unit等于处属性来表示一对一关联。另外一端使用半元素,该元素使用property reference属性指定使用被关联实体主键以外的字段作为关联字段,这块的话呢,尤其尤其需要我们进行注意。
26:24
还有一个细节需要说一下啊,这块有一个图,我们先来看我们这个映射文件。那目前呢,我实际上是在这个depart的表里边加上了一个曼图曼G,增加了一个外键。而在。Manager里边使用的是one to one并没有外键,同学可能会问是吧?如果我两个表都加一个外键怎么样?那来看这个图吧。就是说mind table里边有一个外键DPD引用department table的主件,而department table里边也有一个外键MGD来引用manager表的这个主件,这样可以吗?
27:08
那实际上这样的话呢,会导致比较混乱,而且并不能够真正的实现一对一,我们举一个例子哈。啊,Manager a ABB dept a ABB,那现在的话呢,Manager的AA关联到,呃,指向到de PT的AA,但我这个de pd的AA啊,我有可能指向到manager的这个BB,看见了吧,这个时候就不是一个。一一对应了。这个例子类似于这样啊,两男两女啊,两男A1A2,两女B1B2。啊,A1喜欢B1,那正常的应该是B1喜欢A1吧,那应该不是A1喜欢B1 B1喜欢A2。嗯,A2喜欢B2 B2喜欢A1,这个是不是也是一个一对一啊,但他却不是我们想的这个一对一,就是你对我,我对你,并不是这种。
28:05
清楚吧,所以说的话呢,我们在进行映射的时候呢,我们不使用这样的方式来进行映射。
我来说两句