00:00
下面我们来看如何映射多对多关联关系。先看我们的预模型。我们选了一个category跟item category类别,Item商品。类别跟商品之间可能会有多对多的关联关系。那显然我一个类别可以包含多个商品,比方说小电器类,那包含什么手电筒?剃须刀,MP3等等等。那我这个商品呢,比方说MP3,它有可能属于这个小电器类,它也可以属于数码类,再比方说剃须刀可就可以属于小电器类,也可以属于男性用品,这就是一个多对多的关联关系。下面呢,我们来研究一下多对多关联关系的这个数据库模型是个什么样的。
01:00
从我们这块画的这个图的话呢,说是需要一张中间表。研究一下为什么需要中间表?我们来看这样的例子哈。我现在呢,Category里边有a ABB CC DD,那ID呢是1234 item里边呢也有a abbcc DD,那ID是1234,哎,我想来描述一个单向多对多的关联关系,从。Category down。Item,比方说哎,我说我一包含1234。怎么写啊,那这个呢,属于一。这个也属于一一包含1234吗?也属于一,也属于一,就像一个外电一样,对吧?OK,那我说二也包含1234怎么办?这个还能改为二吗?不能了吧,所以说这个多对多靠这两张表啊,搞不定我们需要一张中间表才可以。
02:07
是吧?我们首先我们确定,哎,改表不行,那中间表的话,我们如何来搞呢?比方说一包含1234111。一来包含。12342呢,222啊,包含1211。23OK,那然后的话呢,再接着写,这样的话呢,那个中间表可以完成多对多的。关联映射看到了吧,所以说我们这块我们有一个这个,嗯,关系数据模型,就是说这个多对多呀。一定得使用一张中间表,中间表里边有两个列,一个是category的外键,一个是item的外键,然后呢,这两个。列联合在一起构成一个组件。
03:02
看一下。N对N关联必须使用连接表,与一对多类似。必须为set元素添加一个kids元素。指定。Categories it这个表里边参照categories表的外键作为它那与一对多不同的是,建立多多的时候,集合元素需要使用many to many。不再是一对多,而是多对多,那我在many to many里边,我还需要指定一个column以指定。Item表的外键是艾特麦。刚才呢,已经分析过了,这块的话呢,大成也有一个印象,下面我们来搞。多对多。N不N。
04:01
碰见一个类。叫开。再创建一个类叫item。简单写啊,写个ID和name。然后它包含多个。I。对应的拜赛方法。哭了。点ID和name。暂时呢,我们先来搞这个单项多最多,所以说这里边我就不写这个category set。
05:01
对应的GA set方法。用。上面的插件生成对应的HB文件。需要改哈。主要是这个category,把这个打开吧。大家看。Item这个呀,没有什么问题,这个需要改为。是OK的是吧。哭了。Angry。我们把这个提到package上。
06:06
Native。A是OK的。OK,使用一个。这个table应该是有一张空间表,而不是这个it啊,我们写成。Angry。这个呢,先不写。D应该是。当前持久化类在中间表里边说那个是有那个外线吧,所以说应该写他。写成czd ID好了,这块需要用。To any。辣的,还是要的。Icon。一个靠拢,这个靠拢呢,指的是这个持久化类在中间表那个外键,所以说我们叫ID。
07:05
就完成。先看效果,然后的话呢,我们再来写这个笔记。拿过来。这两个竖起来。N不N。嗯。应该叫category。Category。这应该这个应该叫。Icon。对应的测试类直接复制过来。发过来。只保留一个text。
08:02
都删了啊。Public test。找间taste save吧。For。找一下生成对应的数据表。没问题。F5刷新按一下。ED I did name。It ID name,中间表cid ID。Out c,我们看一下哈,首先看indexes,他俩是主键,看到了吧。联合组建。Foreign key外键CIID对应的是category的主件,IID对应的是item的主件,没问题。映射就成功了。
09:01
这里边我们来给他。写一下这个笔记在。Category。这里面。这个赛呢,没什么讲的哈,因为我们这个来讲,那个一对多的时候已经说过了,我们说这需要说一下。说指定中间是吧。这块是使用。Many to。指定多。多对多的关联关系吧。Ho呢?需要说一下column指定。Set集合中的持久化被在中间表啊。
10:02
外键列的名称是吧。I can'save。剪一个category。开会一吧。等你。That name。下来。Two two seven eight。P。I。I1等于六。白1.3个内。
11:01
二。二。B下边设定关联关系。Category一点。Items and。儿童一下来。兔,这是一个是吧,两个再来。二执行保存操作开。Accession。单身点save。二。三点C1。哎。执行保存操作。找一个。
12:06
看一下。Insert insert insert insert到这块的话呢,Item category查完了,是不应该查中间表了吧。几条记录啊?两两对应是吧,应该是四条记录,1234 OK,看一下。刷新四条。CATEGORY2条。ITEM2条插入成功。这就是我们的插入操作。再来看一个获取public。我们来。一个category。等于section点一。
13:03
强转。大一点,GA name。搞一个。支持晚加载,只是获取了category,下面有意思了,来了哈,我要是想获取category对应的这个怎么搞啊?等于。点get items sit out items,点他觉得这个鱼应该怎么搞啊?是不是应该去联合那个中间表啊。是。走一个。大家看。这个时候呢,我们实际上是用了一个内链接连的那个中间表吧。在这吗?他跟。
14:02
整个这个任务就完成了,这是我们的查询说啊,需要连接中间。空间表就是用来被连接的,对吧。添加。查询,那更新跟删除呢,没有什么讲的,我们就。不说了。以上我们说的呢,是。单项多对多。那对应的还会有一个双向多对多,跟这个道理是不是一样啊。双向多对多。我们需要注意的是。啊,我在另外一个类里面加上一个set。都使用结合元素使用连接表,我们都知道,我们来看这一段文字,说双向堆多关联,两边都需要指定连接表的表明,以及外间列的列名。那这个时候两端都都使用那个连接表的表明是不是得一样啊。
15:05
对吧,两端用一个连接表,然后两端指定那个外键列也得一样,所以说两端的key跟many to many的靠拢需要交叉相同是吧。再有一个注意的。双向多对多必须一端使用in等于true,如果两端都维护关联关系的话,可能会造成主线冲突。这样的三点。我们先来写,一边写呢,一边来解释。嗯,看item。Private。Bad。P。等于哈西。Pledge。对应的代赛的方法。
16:06
进行映射。Said。注意table空间表怎么写?跟这帮用一个中间表是吧,所以说这两个set table就相同指定。外电裂龙,他是谁呀?是不是item ID?当前持久化类在这个中间表里边那个外键吧,这里边儿已经指定过一次了,是IID考查了。然后再指定many to many。Class。Ugly。高是谁呀,是在这个中间表的。
17:04
外建吧,这里边儿也指定过。就他。所以说的话呢,我们这块有一个叫交叉相同,看一下这个意思,看见了吧,表明必须一样,然后这个K和这个many to many the column,这个K跟这个a many to many the column交叉相同。已经说完了,测试一下到这个里边来。关联关系再指定一下啊X一点。一下来。R。整个下来。改为。我们把先前的数据表给它清除,怎么清除快呀?
18:00
把这个改为。Create。RA。好,走一个。不是这个。对。看一下。哎,出了个问题,看一看什么问题。往下拉。我们看到这块是不是说这个主键重了呀,哎,这个就是我们没有在一个里边设in。为什么会这样呢?因为两边都维护关联关系,在我插入category之后,插入item之后,我category要维护这个关联关系,往这个中间里边插入。四条记录就什么一二。112122。嗯,Item也要插入,Item插的那个跟刚才那开头那个一样,主线重的吗?所以说我们得在一个里边写一个in等于不。
19:11
It was。等于了。没问题。Insert insert insert insert4条,然后是两条category,两条OK。对应的数据表。没问题,因为我这个表的话呢,已经重新生成了是吧,这是我们的什么呀,这是我们的呃,添加操作,那我们这个获取呢,跟先前实际上是一样的,这个我们就不再重复了。这就是我们的双向多对多关联关系,大家呢,嗯,来看一下我这块这个文档就可以,然后同时要参照我们这个代码是吧,把这个代码再敲一遍就没问题了。
我来说两句