常言笑的家

Spring, Hibernate, Struts, Ajax, RoR

hibernate继承实现

hiberate继承分为三种方式:一个表对应所有继承的类,具体类对应一个表,一个类对应一个表(父类及子类)

一个类对应一个表(父类及子类)
数据库脚本

CREATE TABLE `t_item1` (                                   
           `id` 
int(11NOT NULL AUTO_INCREMENT,                    
           `manufacture` 
varchar(20DEFAULT NULL,                  
           `name` 
varchar(20DEFAULT NULL,                         
           
PRIMARY KEY (`id`)                                       
         ) ENGINE
=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC  

CREATE TABLE `t_book1` (                                                                  
           `id` 
int(11NOT NULL AUTO_INCREMENT,                                                   
           `name` 
varchar(20DEFAULT NULL,                                                        
           `manufacture` 
varchar(20DEFAULT NULL,                                                 
           `pagecount` 
int(11DEFAULT NULL,                                                       
           
PRIMARY KEY (`id`)                                                                      
         ) ENGINE
=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC COMMENT='InnoDB free: 3072 kB'  

CREATE TABLE `t_dvd1` (                                    
          `id` 
int(11NOT NULL AUTO_INCREMENT,                    
          `name` 
varchar(20DEFAULT NULL,                         
          `manufacture` 
varchar(20DEFAULT NULL,                  
          `regioncode` 
varchar(20DEFAULT NULL,                   
          
PRIMARY KEY (`id`)                                       
        ) ENGINE
=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC  
类代码
public class TItem1 implements Serializable {
 
private int id;
 
private String name;
 
private String manufacture;

 
public int getId() {
  
return id;
 }


 
public void setId(int id) {
  
this.id = id;
 }


 
public String getName() {
  
return name;
 }


 
public void setName(String name) {
  
this.name = name;
 }


 
public String getManufacture() {
  
return manufacture;
 }


 
public void setManufacture(String manufacture) {
  
this.manufacture = manufacture;
 }


}



public class TBook1 extends TItem1 implements Serializable {
 
private int pagecount;

 
public int getPagecount() {
  
return pagecount;
 }


 
public void setPagecount(int pagecount) {
  
this.pagecount = pagecount;
 }


}


public class TDvd1 extends TItem1 implements Serializable {
private String regioncode;

public String getRegioncode() {
 
return regioncode;
}


public void setRegioncode(String regioncode) {
 
this.regioncode = regioncode;
}


}

配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping>
<class name="mypackage.TItem1" table="t_item1">
 
<id name="id" column="id">
  
<generator class="identity"/>
 
</id>
 
<property name="name" column="name"/>
 
<property name="manufacture" column="manufacture"/>
 
<joined-subclass name="mypackage.TBook1" table="t_book1">
  
<key column="id"/>
  
<property name="pagecount" column="pagecount" type="java.lang.Integer"/>
 
</joined-subclass>
 
<joined-subclass name="mypackage.TDvd1" table="t_dvd1">
  
<key column="id"/>
  
<property name="regioncode" column="regioncode" type="java.lang.String"/>
 
</joined-subclass>
</class>
 
</hibernate-mapping>
具体类对应一个表
数据库脚本
 CREATE TABLE `t_book2` (                                  
           `id` 
int(11NOT NULL AUTO_INCREMENT,                   
           `name` 
varchar(20DEFAULT NULL,                        
           `manufacture` 
varchar(20DEFAULT NULL,                 
           `pagecount` 
int(11DEFAULT NULL,                       
           
PRIMARY KEY (`id`)                                      
         ) ENGINE
=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 
 
CREATE TABLE `t_dvd2` (                                   
          `id` 
int(11NOT NULL AUTO_INCREMENT,                   
          `name` 
varchar(23DEFAULT NULL,                        
          `manufacture` 
varchar(20DEFAULT NULL,                 
          `regioncode` 
varchar(20DEFAULT NULL,                  
          
PRIMARY KEY (`id`)                                      
        ) ENGINE
=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=latin1  
类代码
public abstract class TItem2 implements java.io.Serializable {
 
private int id;
 
private String name;
 
private String manufacture;

 
public int getId() {
  
return id;
 }


 
public void setId(int id) {
  
this.id = id;
 }


 
public String getName() {
  
return name;
 }


 
public void setName(String name) {
  
this.name = name;
 }


 
public String getManufacture() {
  
return manufacture;
 }


 
public void setManufacture(String manufacture) {
  
this.manufacture = manufacture;
 }


}



public class TDvd2 extends TItem2 implements Serializable {
 
private String regioncode;

 
public String getRegioncode() {
  
return regioncode;
 }


 
public void setRegioncode(String regioncode) {
  
this.regioncode = regioncode;
 }


}


public class TBook2 extends TItem2 implements Serializable {
 
private int pagecount;

 
public int getPagecount() {
  
return pagecount;
 }


 
public void setPagecount(int pagecount) {
  
this.pagecount = pagecount;
 }


}

配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping>
 
<class name="mypackage.TDvd2" table="t_dvd2">
  
<id name="id" column="id">
   
<generator class="identity"/>
  
</id>
  
<property name="name" column="name"/>
  
<property name="manufacture" column="manufacture"/>
  
<property name="regioncode" column="regioncode"/>
 
</class>
 
<class name="mypackage.TBook2" table="t_book2">
  
<id name="id" column="id">
   
<generator class="identity"/>
  
</id>
  
<property name="name" column="name"/>
  
<property name="manufacture" column="manufacture"/>
  
<property name="pagecount" column="pagecount"/>
 
</class>
</hibernate-mapping>
一个表对应所有继承的类
数据库脚本
CREATE TABLE `t_item3` (                                 
           `id` 
int(11NOT NULL AUTO_INCREMENT,                  
           `name` 
varchar(20DEFAULT NULL,                       
           `manufacture` 
varchar(20DEFAULT NULL,                
           `pagecount` 
int(11DEFAULT NULL,                      
           `regioncode` 
varchar(20DEFAULT NULL,                 
           `category` 
varchar(11DEFAULT NULL,                   
           
PRIMARY KEY (`id`)                                     
         ) ENGINE
=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1  
类代码
public class TItem3 implements Serializable {
 
private int id;
 
private String name;
 
private String manufacture;
 
private String category;

 
public int getId() {
  
return id;
 }


 
public void setId(int id) {
  
this.id = id;
 }


 
public String getName() {
  
return name;
 }


 
public void setName(String name) {
  
this.name = name;
 }


 
public String getManufacture() {
  
return manufacture;
 }


 
public void setManufacture(String manufacture) {
  
this.manufacture = manufacture;
 }


 
public String getCategory() {
  
return category;
 }


 
public void setCategory(String category) {
  
this.category = category;
 }


}



public class TDvd3 extends TItem3 implements Serializable {
 
private String regioncode;

 
public String getRegioncode() {
  
return regioncode;
 }


 
public void setRegioncode(String regioncode) {
  
this.regioncode = regioncode;
 }


}


public class TBook3 extends TItem3 implements Serializable {
 
private int pagecount;

 
public int getPagecount() {
  
return pagecount;
 }


 
public void setPagecount(int pagecount) {
  
this.pagecount = pagecount;
 }


}

配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping>
<class name="mypackage.TItem3" table="t_item3">
 
<id name="id" column="id">
  
<generator class="identity"/>
 
</id>
 
<discriminator column="category" type="java.lang.String"/>
 
<property name="name" column="name"/>
 
<property name="manufacture" column="manufacture"/>
 
<subclass name="mypackage.TDvd3" discriminator-value="1">
  
<property name="regioncode" column="regioncode"/>
 
</subclass>
 
<subclass name="mypackage.TBook3" discriminator-value="0">
  
<property name="pagecount" column="pagecount"/>
 
</subclass>
</class>
</hibernate-mapping>
三种方式的优缺点
每个类对应一个表
缺点:创建表过多,查询需用求外连接,优点:某个表字段发生变化只需修改相对表,支持多态查询,符合关系型数据库设计
具体类对应一个表
缺点:数据表包含重复字段,如果父类发生变化子类也要变化,查询父类时要查询所有子类,不支持多态查询,优点:符合关系型数据库设计
一个表对应所有类
缺点:表中引入区分子类的字段,子类的字段不能创建为空,优点:只需一张表,有很好的查询性能,只要修改一张表,支持多态查询

posted on 2010-10-08 23:25 常言笑 阅读(220) 评论(0)  编辑  收藏 所属分类: 技术总结


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


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(5)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜