Hibernate中支持3种类型的继承形式:

1.Table per concrete class
表与子类之间的独立一对一关系。

2.Table per subclass
每个子类对应一张子表,并与主类共享主表。

3.Table per class hierarchy
表与类的一对多关系

3种方法的比较。

比较方面

Table per concrete class

Table per subclass

Table per class hierarchy

关系数据模型的复杂度 缺点:表中含有重复字段 缺点:表的数目最多,并且表之间还有外键
参照关系
优点:只需要一个表
查询性能 缺点:查询父类对象,也必须查询所有具体的
子类对应的表
缺点:需要进行表的内连接或者左外连接 优点:无需表连接,查询性能好
数据库Schema的可维护性 缺点:父类发生修改,必须修改所有子类的表 优点:某个类的属性发生变化,只需修改和这个类对应的表 优点:只需要修改一张表
是否支持多态查询和关联 缺点:不支持(实际上,是可以做到的,做法是指定完整的父类路径,参见具体例子实现) 优点:支持 优点:支持
是否符合关系数据模型的常规设计 优点:符合 优点:符合 缺点:
1)在表中,引入额外的区分子类的类型的字段
2)如果子类中的某个属性不允许为null,在表中
无法为对应的字段创建not null约束
配置文件说明
无需变化
使用joined-subclass节点来说明
使用discriminator节点来说明


下面,结合一个例子,分别讨论。

对一个电子商务系统而言,不同的的货物既有共性,也有各自不同的属性。货物都有厂商,名称等属性,而书籍有页数,DVD有分区属性。在面向对象的程序设计中,我们通常将共性抽象为一个基类,而以不同的子类体现具体的特性。

共性归为父类TItem,属性如下:
id:Integer
factory:String
name:String

代表书籍的子类TBook,属性如下:
pageCount:int

代表DVD的字类TDVD,属性如下:
regionCode:String

这三个POJO类对应的Java代码如下:

父类TItem.java
package cn.blogjava.start;

import java.io.Serializable;

public class TItem implements Serializable {
    
private Integer id;
    
private String manufacturer;
    
private String name;
    
    
public Integer getId() {
        
return id;
    }
    
public void setId(Integer id) {
        
this.id = id;
    }
    
public String getManufacturer() {
        
return manufacturer;
    }
    
public void setManufacturer(String manufacturer) {
        
this.manufacturer = manufacturer;
    }
    
public String getName() {
        
return name;
    }
    
public void setName(String name) {
        
this.name = name;
    }
    
}

子类TBook
package cn.blogjava.start;

import java.io.Serializable;

public class TBook extends TItem implements Serializable {
    
private int pageCount;

    
public int getPageCount() {
        
return pageCount;
    }

    
public void setPageCount(int pageCount) {
        
this.pageCount = pageCount;
    }    
}

子类TDVD
package cn.blogjava.start;

import java.io.Serializable;

public class TDVD extends TItem implements Serializable{
    
private String regionCode;

    
public String getRegionCode() {
        
return regionCode;
    }

    
public void setRegionCode(String regionCode) {
        
this.regionCode = regionCode;
    }
    
    
}

下面使用3种不同方式,一一实现。
posted on 2006-07-05 14:58 knowhow 阅读(213) 评论(0)  编辑  收藏 所属分类: ORM:Hibernate及其他

只有注册用户登录后才能发表评论。


网站导航: