Hibernate学习札记(二)

Hibernate学习笔记(二)

    
 继承映射
     继承映射书上介绍了4种方法。其实真正意义上的只有3种。因为第一种方法完全就是每个子类建一个不相关的映射文件。这样做对于多态来说,毫无意义。而且和基本的映射没有区别,这里也就不再复述了。
     第一种方法的标签为union-subclass。中文的翻译很拗口,叫做每个带有联合的具体类一张表。我习惯称之为union。因为Hibernate内部,各个子类的关系就是一种联合的关系。
     这种方法,每个具体的子类代表一张相应的表。各个表之间在数据库那层更本没有关系。只是在Hibernate内部,知道每张表代表的是不同子类的对应的不同的表。所以,在进行多态查询的时候,只通过union把各个表联合成一张大表,做为查询的表,进行查询的。
     也就是因此,如果采用这种方法,不太适合那种需要经常进行多态查询的表。因为每次多态查询都需要把所有子类合并成一张大表。在这里书上有点错误。父类的id的生成器的生成策略是native。至少在mysql的环境下是不行的。其他服务器估计也会产生问题。因为native能保证一张表中的主键的连续。但是无法保证在多个表中主键的唯一。所以无法在这种,会生成多张表的,且需要多张表的主键都唯一,这显然不行。
     第二种方法是得标签是subclass。叫做每个层次一张表。具体的说,就是所有单个类的数据都放在一张表上面。
     打个比方来说,比方说主类A有a,b两个属性,子类B其特有c属性,C则有d属性,那么代表这个的表中,就会有a,b,c,d 4列。如果这样设计的优势就是查询不再需要多张表连接了。速度会快很多。同样的带来的问题就是,如果子类有很多,同时每个子类都有着其独特的属性,那么这个表就会很大,同时很多列会浪费掉。还有一个很头痛的问题就是子类的独有属性不能设置成unique。
       所以这种办法,书上建议是最好的子类之间的区别是其行为,而不是属性的时候使用。这样生成的表就会精简很多。
       第三种方法,标签是join-subclass。其数据库实现是主类的属性一张表,然后各个子类的信息一张表。且子表的主键参照记录在主表中记录的主键。
       我觉得这种方法感觉很中性,因为第一种方法如果不考虑多态查询的话是很好的。而第二种呢,多态查询时方便。但是如果每个属性都有着自己的独特属性,就会一些数据库层次的东西。而这种方法则是一种平衡。
           最后混合方法。其实就是一种嵌套。不过记住。没有subclass。如果用了subclass。则是子类的子类了。
       Hibernate数据类型
           这一些基本看书吧。基本上技术上那点东西。不过我就觉得要注意两点
           其一,不同的string对应的值。其二,和Hbiernate无关,就是Calendar的月份起始是0。

        (附件为自己根据书上写的例子,自定义类型由于书上例子写的很模糊,后来去网上找了一下原本的案例。看的一般懂,所以没有对例子中的代码改进)