论坛首页 Java企业应用论坛

使用 Subclass 有什麽好处,优点么?

浏览 10520 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-09-27  
robbin 写道
lyo 写道
robbin 写道
http://forum.iteye.com/viewtopic.php?t=1464&postdays=0&postorder=asc&start=30

你看一下我在那个帖子里面给出来的class diagram。

这是一个应用场景,该场景中Award是奖品类,奖品分为两种:一种是实物奖品,又分为现金奖品和其他赠品,例如手机什么的,另一类是虚拟奖品,虚拟奖品又分为你在系统中的积分,和你在系统中获得的道具。

这是一个奖品的继承树关系,每个子类都具备父类的所有属性,但是又具备自己单独的属性。


多谢回复,那个关系我知道,但是看不出来这种设计有任何突出的好处,他只是减少了数据表的数量,简化了POJO的编写(也就是使javabean更简单,因为子类的javabean只需要更少的属性),但是核心问题是:它能给查询带来什麽好处?我暂时想不出来什麽情况下需要把一个父类和他的所有 subclass查询出来(因为这种父子关系并不是以前我们讲的one-to-many!)。版主能解释一下我这个疑问么?多谢!


这种设计不是为了数据库查询而准备的,而是为了支持整个继承树的持久化功能而做的。你思考问题的角度要从OO持久化来考虑,而不是数据库的什么操作,如果思路转变不过来,学了半天都是白学。

例如我想统计一下当前这个系统当中还剩下多少奖品,如果奖品低于一个比例,我就要给这个游戏系统增加奖品了。此时你不需要关心子类,只需要统计一下Award有多少个就行了。类似的,如果我想看一下系统中有多少实物奖品被领用了,如果达到一个比例,我就要通知人家来领奖了。此时我只需要统计一下ObjectAward有多少个就行,而不需要分别统计两个子类再累加。


哦!原来想的思路都不一样,难怪想不通!
0 请登录后投票
   发表时间:2004-09-27  
potian 写道
这个叫做多态查询,是ORM最强有力的工具之一

所谓多态查询就是可以在查询时只考虑到某一个类层次,因为我们知道子类和父类是一种is a的关系。例如B'继承B,那么B' is a B。如果我们需要针对所有(或者某些条件下)B类型的实例进行处理的话,那么显然B'类型的所有实例同样也是B类型的实例。

因此通常我们不需要知道查询的结果(我们引用的对象)到底是哪一个具体子类。

这种映射方法多态查询效率最高,不需要连接


多谢解答,那麽什麽情况下 join更有优势呢?是不是子表的新增字段很多的时候?
0 请登录后投票
   发表时间:2004-10-01  
robbin 写道
mochow 写道
robbin 写道
http://forum.iteye.com/viewtopic.php?t=1464&postdays=0&postorder=asc&start=30

你看一下我在那个帖子里面给出来的class diagram。

这是一个应用场景,该场景中Award是奖品类,奖品分为两种:一种是实物奖品,又分为现金奖品和其他赠品,例如手机什么的,另一类是虚拟奖品,虚拟奖品又分为你在系统中的积分,和你在系统中获得的道具。

这是一个奖品的继承树关系,每个子类都具备父类的所有属性,但是又具备自己单独的属性。


有个疑问
 1  create table award ( 
 2     id INTEGER NOT NULL AUTO_INCREMENT, 
 3     subclass CHAR(1); not null, 
 4     type VARCHAR(20); not null, 
 5     map_id INTEGER, 
 6     cell_id INTEGER, 
 7     acquriedTime DATE not null, 
 8     player_id INTEGER, 
 9     amount FLOAT not null, 
 10    points INTEGER not null, 
 11    toolcode VARCHAR(20); not null, 
 12    award_id INTEGER, 
 13    primary key (id); 
 14 ); 
 15  
 16 alter table award add index (player_id);, add constraint FK58E7A5D906ADF39 foreign key (player_id); references play (id); 
 17 alter table award add index (award_id);, add constraint FK58E7A5D9F52FE3D foreign key (award_id); references play (id); 
 18 alter table award add index (cell_id);, add constraint FK58E7A5D2786D518 foreign key (cell_id); references cell (id); 
 19 alter table award add index (map_id);, add constraint FK58E7A5DBF8B7EDE foreign key (map_id); references map (id);


你表中那些子类的私有属性是not null的,那些没有这些属性的其他类的对象该如何处理这些不属于自己的属性值?
比如acquriedTime,假如我另有一个类VirtualPointsAwards的对象(VirtualPointsAwards根本没有acquriedTime这个属性,那么DB中对应的row中aquriedTime的值你怎么处理。


可以指定一个数据库默认值,让数据库自己去填充。如果没有这个字段的对象,是不会去读这个字段的。

是不是需要创建null object呢?
0 请登录后投票
   发表时间:2004-10-08  
我想请教一下:
  在一个表对应一个类体系时,为什么subclass的属性一定要not null呢?java中的一个子类不会包含其它子类的属性,那么其它子类的属性是否可null对该子类的持久化有什么影响呢?
  如果我们能够配置hibernate在持久化一个子类到数据库时设置非该子类的not null字段值为某缺省值(不同类型有不同形式的缺省值),那么是不是就可以去掉subclass的属性一定要not null的限制呢?
0 请登录后投票
   发表时间:2004-10-08  
mochow你是MM?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics