00:01
下面我们来看如何映射继承关系。在面向对象里面呢,这个继承和多肽是两个最基本的概念。当然也是两个最重要的概念。大量的一个继承关系哈,Person是父类,Student是子类啊,他们之间有这样的一个继承关系。Hamlet的继承映射可以理解持久化类之间的。继承关系就是说我经过harmlet这个继承映射之后呢,比方说我进行查询的时候,我查询所有的person,这个时候我不但能够得到person对象,我还可以得到student对象,因为student也是一个person嘛。这种查询叫。多态查询。但前提是我们先得搞出来这个继承映射。下面具体看一下如何来搞这个继承映射。
01:02
Harmont支持三种继承映射映射策略分别是使用class、使用joined class、使用union class来进行继承映射。一个一个看,先来看,使用s class进行继承映射。使用s class继承映射可以实现对于继承关系中父类跟子类共用一张表。哎,我们来看底下我们截的这个图,这里边呢,ID person name跟A只是父类person,而这个school是子类student,这个子类啊,只比父类多了一个字段叫school。我现在呢,我父类的记录跟子类记录放一张表里边看到了吧,所以说这里边儿既有父类的字段,也有子类。也有子类的字段,那我如何来区分啊?我这个记录是父类记录还是子类记录呢?我需要多一列,这一列我们称之为。
02:10
辨别褶裂。就是这个type叫辨别者列,这个列名随便起,这个列的值也可以随便起。使用s class来映射此类。我们需要在class或class的。Discriminator value里边指定鉴别者列的值。但是呢,这里边啊,这种映射呀,有一个缺点,缺点是什么呀,因为我父类跟子类共用一张表对吧。那我子类有死库这个字段,我父类是不是没有啊?懂吧,所以说在我插入一条父类记录的时候,我父类压根就没有这个字段,那这个字段就应该是空了吧。
03:03
所以说,子类所独有的字段不能够添加非空约束。看到了吧,来搞一下这个。Sunglass。先创建一个person。Private in a ID。Private student name。Private entered age。爱赛的方法。啊,一个子类叫student。继成字出来,多一个字段。
04:04
对应的盖在方法。这边。来进行映射。首先我们使用这个。Hamlet这个插件生成。HBM文件,我只生成person就可以了。走一个看一看。这个包名呢,能顶上。不是。被被拿掉。下来ID使用的应该叫。Me?Name。位置,这都是基本的映射,下边我们来映射。
05:02
子类。Student。第一把我们说使用什么映射啊,我们使用sub。进行映射。Sublas。Last,名叫student。N person在一张表里边,所以说不用写table对吧。自己的。Property叫cool。Tap不对,克隆过。下边呢,我们需要指定这个辨别者列。位置辨别者列。Itin。
06:02
Column。我看一部吧。类型,Cap。我们叫形,那a person这个值是什么呢?一个值。叫。Person就指你随便写,你也可以写成一,你也可可以写成其他的串,写person的话呢,借名之意。这个呢,我们写为。这样这个映射就搞定了。放到配置文件里边来。上班。Class。最里边的叫。就是累不止一个过来。
07:14
Public VO。'save。At a test。找一个。看对应的数据表,会生成一个B。来看ID APP name school。哦,这个type就是那个辨别者列,这个school呢,是那个子类。库对应的字段,而这个ID name age是父类子类都有的字段,对吧,执行一个保存操作。
08:06
A age11。点,比方说叫AA执行一个保存。再搞一个student。Acu an set age。The team said。Name。SQ点。At硅谷。也执行一个保存save。有一个小九。看两条insert,你看插person的时候,这个type值是不是就person啊。插student,有school哈,这个值就叫student。
09:05
过来看,就是这样的一个效果,插入成功。注意看哈,这个库这个值是空,而且这个type呢是哈let自动维护的。你们写一下关于插入。插入操作。对于此类对象。对于子类对象指区。把记录插入到一张数据表。数据表数第二。别整理。有。
10:01
大内自动维护,程序员不用操心。再来看一个查询。Public VO get query。注意哈,这是一个查询操作。我们谈一个list。等于3.create。Query from a。Out presents are size。应该是一个多态查询吧。诶,全查出来了,这确实是一个多态查询哦。我这个建表的方式貌似现在是C。
11:07
改为update,我说什么呀,以前那些记录啊。没有了。再执行一下save。这个时候出错了,为什么?他说。不知道这个department这个实体类。看一看。哦,我这个harmony test搞得不对吗?执行它再瞧一下。对,这个test的话呢,刚才搞错了哈。再来看这个query。哎,隐藏记录,这个时候多态查询只需要查一张表。
12:08
查询。第一个,查询父类记录。只需要查询一张数据表可以了。第二个。对于。子类记录这几张表啊。List。Student。等于点query。From student。At east。Out。再找一下。
13:02
大家看我要是查此类记录的话,它是不是自动的用这个type啊啊,也只需要查一张一张数据表也只。需要查询一张数据表,为什么写这些呀,因为后边的话呢,我们要跟另外两种映射方式去进行对比。这样的话呢,我们使用这个萨class进行映射,基本上OK了,那有没有缺点呢?缺点。他觉得有什么呀,第一个缺点。使用了辨别者。列,因为这一列毕竟不是属于我们这个具体数据表的,需要加这么一列。第二个我们说。
14:00
子类。独有的字段不能添加。非公约束业专业。三。我如果这个继承的这个层次比较深的话。会导致我这个数据表的字段也比较多。不。一城。钢刺。道身则。数据表的字段也会较多,这是一种映射的缺点。行了,别的话呢,再没什么了。再来看一下这个映射文件,这个映射文件呢,啊也是比较好理解的哈,我们就是需要加上这样的一个辨别者列,然后呢,我们在这个class跟s class需要指定这个辨别者列的值。
15:08
看。第二种映射方式叫使用join some class进行继承映射。这个呢是每个子类一张表。然后说子类实例由附表跟子类共同存储,有点奇葩哈,大家看persons,有一张person表。不是你有啥字段,我有啥字段。子类所独有的这个属性呢,放在另外一张表里边,这个叫students,这里边只放我子类独有的字段。但是问题出来了,那我这个应该跟哪一个person的记录相对应啊,哎,我用这样的一个主键关联的方式,这个关联类似于我们讲一对一主键关联的一个关联,就是说这个是主键,但这个主键呢,参照persons表的一个主键,这是它的一个外键,懂这个意思吧,一会儿的话呢,我们能够看能够看见这个效果说,嗯,子类使用K元素来映射共有主键。
16:16
那这个里边我们不用有那个辨别者列,所以说子类增加的属性可以添加非公约数。瞧一瞧。那把这个拿上去吧。上去。You joined some class。首先我需要来改一下这个包名。不需要这个分别折叠了。
17:04
这也不需要。准备用这样用断的发布class。八。我们需要注意的是,它需要指定table。我自己得有一张数据表了哈。然后呢,找一个开店。这个外电相当于是在映射这个表的主键。但是呢,他使用。这个ID来作为外键,懂这个意思吧,我这个表也是有主见的,就是这个K,但是呢,它参照。呃,附表的这个主键主键值。写一个吧,Poem,我们叫student。
18:03
Ad。Student。这个马上去欧了。这里边配一下这个名字叫。Joined。大。测试一样的。这个数据表我先给他删了。对吧。Save。找一个。这个插入是什么情况啊。附表自个儿。插入。子表记录怎么样?需要插两张数据表?
19:01
你看一下他吧,F5。Bo。ID name age,看见了吧?Students在这呢?O at,硅谷二先看一下这个外键。是不是有这个外键啊,没问题,好了,回来看这个表数据,这个时候呢,我插入一条父类记录的话,直接插,我插此类记录的话,我需要。插入两张表,所以说这个插入性能呢,就要差一些。对于此类记录。需要插入多长表?需要至少吧。至少需要。插入到两张。数据表中所数据插入性能跟第一个比就要差一些了。
20:04
再来看这个。查询炒作。直接找一个。查询我们看。多态查询需要连接。父表跟子表。我查一个student,是不是也得查这个附表工资表啊,那查询跟先前那个也要查,需查多张表啊。做一个左外。链接查询做一个内查询。播一个黑链家。那链接查询那个查询速度跟先前那个比起来也要。弱一点。查询偏弱,插入也偏弱,所以说我们这块就得说优点了哈,不能说缺点了,优点。
21:04
第一个优点啊,不需要使用辨别啫裂。第二个优点,子类独有的字段能添加被同学数。第三个优点来。一个好处就是。不啊。父类对应的字段在附表里边,子类对应的子类所独有的字段在子表里边,所以说没有冗余的字段。没有冗余的段。优点。OK,这就是我们这块说的这个使用join的class进行映射。看最后一个。采用unions some class元素进行继承映射。
22:01
这种方式呢,是将每个实体对象映射为一张独立的数据表,那实际上这种映射方式是最符合我们对数据库的这个认知方式的,Person就是person student就是student,看到了吧?Person里边有ID name age student里边也有ID name age。子类新增的属性可以有非空约束,子类实例仅保留在子表里边,不需要鉴灭者列使用union s class。不能用identity这个组件生成方式。瞧一瞧。叫。Union some class。把这个必须往前走一个。Unit。Class。点关掉,把这个。
23:02
打开。Union。这个映射呢,确实是非常的简单,拿掉。没者列表。这个也拿掉。Onla。Name表明table。自己张数据表吗?你告诉我表明不需要什么外界。不需要什么T,直接写自己有的属性就可以。就OK了。
24:02
特制。Control o。把这个数据表先删除。测试一下。一个。说。不知道person这个实体类哦。没改哪个没改harm配置文件。这个需要改为。还不行,说不能够使用。Identity这个ID我们是不是没改呀。
25:01
我暂时先改一下,一会我们说为什么不能用identity,很记得对于my circle是不是用那个自征啊,我们先改为he。成功。插入。只有两条色口对吧,前面这个是为了什么呀,为了搞这个ID的啊,插入只有两条色口,这个插入性能呢,应该说还不错。嗯。B。看到了吧。F5。Process。Building。这个也不对呀。Person这个是对的,这个student是什么呀?这还是个student ID还是带那个外键那个呢。看一看我这个。
26:02
配置文件。写错了是吧,写了一个tables student。刚才跑这儿来了哈。也删了。也删了。插入呢,还是一样的,只有两条色口。两条银色的,前面这个是搞ID的哈。看一下。Students students啊,有一个school,前三个字段跟这个一模一样。研究一下说插入性能还不错。不错。我们来看这个查询性能。
27:07
我们看。查。子类的不错。查父类的需要怎么办呢?查父类需要有字查询。查父类的嘛,查父类的话呢,他搞了一个子查询哈,把父类的子类的放一起了,然后再查。因为。多态查询的话,我这个student里边是不是也有记录啊,这个里边也有,所以说需要把这两个表给它连起来,它怎么搞的呀。他是这么搞的,他搞了一个子查询UN搞了一个并集,然后的话呢,来来做的查询,所以说查询父类记录的这个性能偏弱虚。把附表。和子港。
28:01
记录汇总到一起再做查询,这个查询性能就弱一点,性能稍差。这个是查询。你来看一下这个优缺点吧。优点。那我们前面比的话呢,说不需要使用它。无需使用。没了。此类独有的字段能添加非公约数。下一个是缺点啊。Treat。存在。冗余的字段是吧。这个时候就是这样。
29:00
Person有ID name age student是不是也有这个ID name age啊,所以说这个里边的话呢,多了三个荣誉字段是吧?ID name age这里边不是已经有了吗?我这里边又加了这样的三个字段。实际上呢。还有一个缺点就是在我们做更新的时候会比较麻烦看一下。比方说我更新。负类的这个字段,比方说改年龄,我把年龄改为20。写一条HQL,这个呢,我们在后边我们会讲到使用HQL。Update。P。SPH等于20。进行更新操作。
30:02
Create query hql update。找一个看这个是怎么做更新的。看到。这个更新是不是比较麻烦呢?看到了吧。为什么比较麻烦呢?因为这个更新的时候啊。我这个age。是不是附表里边有这个A子表里边是不是也有啊,所以说这个更新要。麻烦一点。直接说这个结论了哈。更新的效率较低。或更新附表弱更新。附表的字段的更新较低。
31:04
附表做更新,附表的字段要更新的效率比较低,这个就是我们的union class,但这个映射呢是最简单的,而且这个数据表啊,相对而言我们看着也是比较舒服。但是每一个都有各自的优缺点。这是我们总结的一个这个优缺点的一个图哈,大家可以详细来看一下,里边主要的内容呢,我们在前面已经。讨论过了,那具体用哪一个,这个根据项目需要来选择不同的方式,一般而言的话呢,我们会推荐使用这个UN class或者是join class。而第一种。有明显的缺点,就是子类的这个。就是子类所独有的这个字段啊,不能添加非公约数,这个有的时候呢,确实是忍受不了。我们再说一句哈,这个继承映射呢,这开发的时候用的并不是特别多,所以说大家整个的这个心态就是做一个了解就好。
我来说两句