00:00
下边呢,咱来说双向多对多的关联关系,这里边我们需要注意的是使用many to many这个注解。同时呢,需要使用中间表,这个中间表叫转cable,这个注解看到了吧,双向多对多。必须有一方放弃维护关联关系。否则怎么啦?在中间表里边儿就会出现主键重复的问题。在har的时候详细说过。OK,开始。首先创建两个持久化类。我们一个叫item,具体的商品还有一个叫category类别,一个类别可以有多个商品,同样一个商品也可以属于多个类别。写对应的属性。
01:05
Private STEM、哈希set。Get a settle。再来。In类型的ID string型的name set category categories等于new哈希。Get a settle。我们来添加对应的注解,At ENT at table GPA,下班了,Items。
02:10
主键at ID at generated value往下翻映射数据列的名字,Name叫什么呀?Item name。再往下翻,Category many to many映射了哈。使用什么呢?Join table中间表好的。好的,这里边的话呢,我们需要写一个columns,就是什么呀,中间表里边列的名字。ADD。John。K。这个列的名叫什么呢?就是当前这个,呃,当这个数据表主键站里边的外键,我们叫艾特麦。
03:16
好的,同时呢。我还有一个干什么呀?告诉说我指向谁?我指向列的名字是当前表的主键,叫什么叫?叫ID版。对吧,ID我们写column嘛。还没完。停掉,还有一个属性叫。Inra columns。等于an转column。Name。这个呢,应该是category ID就是什么呀。我关联那个对象在数据表里边的外键。
04:04
它指向谁呢?它指向reference column name指向。Category组件的名字,这个应该叫什么呀?叫ID,这两个不写也可以。好了。过来,这个里边我们写上at ENT at table name。GPA category。Categories。过来at ID at generated value,注意这个时候这个ID的名字是什么呀?是不是就是ID呀,所以说这个里面我们指向的也是ID。懂吧。过来。An。Po name category name。
05:02
再来ADD money to many,同时map by等于。这个里边的congress。搞定。我到这个里边来,把这个拉下来。CTRLCCTRLV,一个叫。It,一个叫Kay的。好,错误全没有了,我们先生成对应的数据表,看一下public void test many to many at,找一个。F5刷新我们看一眼哈。Item。
06:01
Category。这个。哎哟,GPA it jpa categories哦,我没有去映射这个中间表的名字对不对。这里边中间表的名字这个忘写了,刚才。表的名字等于。叫。It Calgary。我把这给他删了,重新来一把。再找。F、刷新。来。Item category,有吧。右键auto cable,看两个外键是不是对的啊。没问题吧,诶外键是对的,然后索引啊,这两个是什么呀?是联合主键吧。
07:06
对吧,OK,好了,我们看这个外键,我们结合这个外键呢,来说我们这块用的这个事,大家看John column意味着是。当前表在中间表的那个外名叫什么,叫什么呀,叫地吧。是吧,哎,这个就叫艾特麦,然后它关联谁呢?它关联当前表的这一列。看见了吧,光联当前表的ID这一列,它就是什么呀?指向列的名字是谁呀?是不是它呀,叫ID,看见了吧,就这个意思,哎,你结合这个来看的话,就会更加的清楚。这个就是我们的这个叫什么叫John column的name。把这个拿上来。上去。看不到啊。对上。
08:02
再上还是看不到。上去可以吗?小一点。嗯,这个往上移。差不多,哎哟,这个它不能往下拉,你发现了吗。八一点。好吧。好吧,看的不是非常清楚哈,那我们就最大化吧,就是这个意思,这个什么叫I特IDID指的是谁啊,只是它吧,然后它指向谁呢?它指向当前表的ID,看见了吗?这个ID就是我们这块这个叫。Column column,好了,这个道理是一样的。Ver状columns指的是对方那个表的。外界的名字叫category ID,它指向对方那个表的这一列,实际上它就是主键,对吧?
09:01
说使用at。Many to。Money。注解来映射。多对多。关联关系对吧。还没完,还没完,使用使用at join table来映射中间表,具体的小1NAME指向中间。表的名字,小二转columns映射当前。类所在的表在中间表中的外键再具体1.2.1name。
10:12
指定外界列的列名2.2,我们还有一个什么呀,Reference column name。这个指定指定外键列关联当前表。The。当前表的哪一列是吧三。这个。映射。关联的类所在。中间表的外键中间好了。
11:04
3.13.2跟这个道理是一样的,我就不再进行指定了,这个映射就成功了。我们来测试一下,我们也先来测试一个persistence吧。It ae等于new。I1.site。ID。Item it等于new item I i.set item name it。Category。C等于new category c.set categor name c categoryc two等于new category。
12:09
C two.set cover name c two设置,关联关系设置。关联关系。I一点get c.I。C a2a一点get c.a c two,这只是一种。CTRLC。二对吧。然后呢,c1.get。C一点。Get。哎哟。II。不。CTRLCCTRLV。
13:03
二好了,直行保存,直行保存。manager.per。IE。A2C1C2走一个看效果。失败了,没有成功对吧,嗯,我们看见这块发了一些insert,但没有完全的发完。中间表插入的没形,为什么呢?我们把这个错误给它拷出来,看一下这是一个什么错误。
14:00
看一下为什么。往下我们来看这个cosby,他说什么呀,他说。这是一个这个对象是一个没有被保存的有理对象,叫什么呀?Category category是一个有理对象,我们来看这个代码,往后翻看。保存I1I2C1,这是不是应该C2啊。问题就在这儿。最早。过了,看我们的。代码。八条insert。打开。这个是没问题的,对吧。哦,我们这个已经成功的,不是这个这个成功加进来了OK的。搞定啊,这就是我们多对多的保存,其实没有什么说的是吧,多对多的保存好了,我们再来看一个多对多的获取。
15:04
取吧,就看点什么呀,看一点我们要是。获取。呃,维护关联关系那一方的跟不维护关联关系那一方的有区别吗?我先来搞一个item item是维护关联关系的吧,等于manager.fan。Item点儿class。我来写一个。呃,五是吗?Item没问题。没问题,然后呢,我们来。Set out一个。item.get item name,然后sit out一个item点。
16:04
Category。Size看效果。走一个。我们看诶默认使用懒加载没问题吧,用了中间表好的,对于关联的集合对象。默认使用懒加。载的策略很好,现在呢,我们再来看一看,我要是先获取category,会有不一样的地方吗?Category等于nity manager.find category。点class。5OUT category点有点get。
17:08
Cator name,然后set out category.get items.size,好的。再找一个。木有过来。CATEGORY5没有吗?难道?Category。哦,这是三和四对吧,那就是三吧。三。找一个。过了我们看,诶也是这样的方式是吧,因为这是有一张中间表,两边是对称的,所以说先获取使用吧,使用。维护。关联关系的一方获取还是使用不维护关联关系的一方获取?思考宇宙相同。
18:14
对吧,它们之间是不是一个对称的关系啊,大家懂吧,你一对一的不对称在哪啊,因为我到底要把那个外界放在哪张表里边儿吧,它不一样,这个是有有一张中间表。另外那两张表对于这个中间表而言是平等的。再看一眼中检表吧。不是他吗?好了,这就是我们讲的这个双向多对多的关联关系,大家,呃,这块的这个find跟persist没有什么说的,Persist没什么说的,那需要说的是什么呢?就是我们这块这个映射使用了。转cable name指定中间表的表明用John columns来指定。
19:04
当前类所在表在中间表里边的外键name指定外键外键的名字referenced column name指定使用当前表的哪一列来进行关联。Ins columns指定我关联的类在中间表里边的外界,这个name跟reference的column name跟这个意思是一样的。
我来说两句