hibernate继承实现

http://www.blogjava.net/xiaodu/archive/2008/07/11/214188.html

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

一个类对应一个表(父类及子类)
数据库脚本
CREATE TABLE `t_item1` (                                  
           `id` int(11) NOT NULL AUTO_INCREMENT,                   
           `manufacture` varchar(20) DEFAULT NULL,                 
           `name` varchar(20) DEFAULT NULL,                        
           PRIMARY KEY (`id`)                                      
         ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC 

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

CREATE TABLE `t_dvd1` (                                   
          `id` int(11) NOT NULL AUTO_INCREMENT,                   
          `name` varchar(20) DEFAULT NULL,                        
          `manufacture` varchar(20) DEFAULT NULL,                 
          `regioncode` varchar(20) DEFAULT 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(11) NOT NULL AUTO_INCREMENT,                  
           `name` varchar(20) DEFAULT NULL,                       
           `manufacture` varchar(20) DEFAULT NULL,                
           `pagecount` int(11) DEFAULT NULL,                      
           PRIMARY KEY (`id`)                                     
         ) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1
  CREATE TABLE `t_dvd2` (                                  
          `id` int(11) NOT NULL AUTO_INCREMENT,                  
          `name` varchar(23) DEFAULT NULL,                       
          `manufacture` varchar(20) DEFAULT NULL,                
          `regioncode` varchar(20) DEFAULT 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(11) NOT NULL AUTO_INCREMENT,                 
           `name` varchar(20) DEFAULT NULL,                      
           `manufacture` varchar(20) DEFAULT NULL,               
           `pagecount` int(11) DEFAULT NULL,                     
           `regioncode` varchar(20) DEFAULT NULL,                
           `category` varchar(11) DEFAULT 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>
三种方式的优缺点
每个类对应一个表
缺点:创建表过多,查询需用求外连接,优点:某个表字段发生变化只需修改相对表,支持多态查询,符合关系型数据库设计
具体类对应一个表
缺点:数据表包含重复字段,如果父类发生变化子类也要变化,查询父类时要查询所有子类,不支持多态查询,优点:符合关系型数据库设计
一个表对应所有类
缺点:表中引入区分子类的字段,子类的字段不能创建为空,优点:只需一张表,有很好的查询性能,只要修改一张表,支持多态查询

hibernate继承实现,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。