这里详细讨论继承映射的3种方式:

1.Table per concrete class

继承关系如下图:

数据表设计如下图:

MySQL数据库中执行如下DDL:

  1. CREATE TABLE defaultuser (
  2.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  3.     name VARCHAR(100) NOT NULL default '',
  4.     someProperty VARCHAR(100)
  5. );

  6. CREATE TABLE poweruser (
  7.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  8.     name VARCHAR(100) NOT NULL default '',
  9.     otherProperty VARCHAR(100)
  10. );

User.java

  1. package com.hb3.pack_08.model;

  2. public class User {

  3.     private Integer id;
  4.     private String name;
  5.     
  6.     public User() {
  7.     }

  8.     public Integer getId() {
  9.         return id;
  10.     }
  11.     public void setId(Integer id) {
  12.         this.id = id;
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20. }

DefaultUser.java

  1. package com.hb3.pack_08.model;

  2. public class DefaultUser extends User {

  3.     private String someProperty;

  4.     public DefaultUser() {
  5.     }

  6.     public String getSomeProperty() {
  7.         return someProperty;
  8.     }
  9.     public void setSomeProperty(String someProperty) {
  10.         this.someProperty = someProperty;
  11.     }
  12. }

PowerUser.java

  1. package com.hb3.pack_08.model;

  2. public class PowerUser extends User {

  3.     private String otherProperty;
  4.     
  5.     public PowerUser() {
  6.     }

  7.     public String getOtherProperty() {
  8.         return otherProperty;
  9.     }
  10.     public void setOtherProperty(String otherProperty) {
  11.         this.otherProperty = otherProperty;
  12.     }
  13. }

DefaultUser.hbm.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping>

  6.     <class name="com.hb3.pack_08.model.DefaultUser" table="defaultuser"> 
  7.     
  8.         <id name="id" column="id" type="java.lang.Integer"> 
  9.             <generator class="native"/> 
  10.         </id> 
  11.         
  12.         <property name="name" column="name" type="java.lang.String"/> 
  13.         
  14.         <property name="someProperty" column="someProperty" type="java.lang.String"/>        
  15.          
  16.     </class> 
  17.     
  18. </hibernate-mapping>

PowerUser.hbm.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping>

  6.     <class name="com.hb3.pack_08.model.PowerUser" table="poweruser">
  7.      
  8.         <id name="id" column="id" type="java.lang.Integer"> 
  9.             <generator class="native"/> 
  10.         </id> 
  11.         
  12.         <property name="name" column="name" type="java.lang.String"/> 
  13.         
  14.         <property name="otherProperty" column="otherProperty" type="java.lang.String"/>      
  15.            
  16.     </class> 
  17.     
  18. </hibernate-mapping>

修改hibernate.cfg.xml文件:

......

<mapping resource="com/hb3/pack_08/model/DefaultUser.hbm.xml" />
<mapping resource="com/hb3/pack_08/model/PowerUser.hbm.xml" />

......

 

  1. package com.hb3.pack_08;

  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import java.util.Iterator;

  5. import org.hibernate.Query;
  6. import org.hibernate.Session;
  7. import org.hibernate.SessionFactory;
  8. import org.hibernate.Transaction;
  9. import org.hibernate.cfg.Configuration;

  10. import com.hb3.pack_08.model.DefaultUser;
  11. import com.hb3.pack_08.model.PowerUser;
  12. import com.hb3.pack_08.model.User;

  13. public class BusinessService {

  14.     public static void main(String[] args) throws IOException, SQLException {
  15.         
  16.         Configuration config = new Configuration().configure();
  17.         SessionFactory sessionFactory = config.buildSessionFactory();      
  18.         Session session = sessionFactory.openSession();

  19.         
  20.         DefaultUser defaultUser = new DefaultUser();
  21.         defaultUser.setName("chenyan");
  22.         defaultUser.setSomeProperty("hu....hu...");
  23.    
  24.         PowerUser powerUser = new PowerUser();
  25.         powerUser.setName("shenbin");
  26.         powerUser.setOtherProperty("Bla...Bla...");

  27.         Transaction tx = session.beginTransaction();        
  28.         session.save(powerUser); 
  29.         session.save(defaultUser);      
  30.         tx.commit();
  31.         
  32.         
  33.         session.close();
  34.         session = sessionFactory.openSession();
  35.         
  36.         
  37.         Query query = session.createQuery("from com.hb3.pack_08.model.User");
  38.         Iterator<?> iterator = query.list().iterator();
  39.         while(iterator.hasNext()) {
  40.                 User user = (User) iterator.next();
  41.                 System.out.println(user.getName());
  42.         }
  43.         
  44.         
  45.         session.close();
  46.         sessionFactory.close();
  47.     }
  48. }

请注意:查询中查询的是User,所以会找出所有DefaultUser和PowerUser的资料。User类中不包括的他子类特有的字段也会被找到。

值得一提的是,查询中如果直接使用"from java.lang.Object"这样的HQL的话,将查出数据库中所有的数据资料。因为Object是Java中所有类的父类。

 

2.Table per class hierarchy

数据表设计如下图:

DDL文件:

  1. CREATE TABLE user (
  2.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  3.     userType VARCHAR(50) NOT NULL,
  4.     name VARCHAR(100) NOT NULL default '',
  5.     someProperty VARCHAR(100),
  6.     otherProperty VARCHAR(100)
  7. );

POJO同上,分为:User,PowerUser,DefaultUser。

User.hbm.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE hibernate-mapping 
  3.     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

  5. <hibernate-mapping> 

  6.     <class name="com.hb3.pack_09.model.User" table="user"> 
  7.     
  8.         <id name="id" column="id" type="java.lang.Integer"> 
  9.             <generator class="native"/> 
  10.         </id> 
  11.         
  12.         <discriminator column="userType" type="java.lang.String"/>   
  13.               
  14.         <property name="name" column="name" type="java.lang.String"/> 
  15.         
  16.         <subclass name="com.hb3.pack_09.model.DefaultUser" 
  17.                   discriminator-value="Default"> 
  18.                   
  19.             <property name="someProperty" 
  20.                       column="someProperty" 
  21.                       type="java.lang.String"/> 
  22.         </subclass> 
  23.         
  24.         <subclass name="com.hb3.pack_09.model.PowerUser" 
  25.                   discriminator-value="Power"> 
  26.                   
  27.             <property name="otherProperty" 
  28.                       column="otherProperty" 
  29.                       type="java.lang.String"/> 
  30.         </subclass>
  31.                  
  32.     </class>
  33.      
  34. </hibernate-mapping>

修改hibernate.cfg.xml文件:

......

<mapping resource="com/hb3/pack_09/model/User.hbm.xml" />

......

 

测试代码也和上面的基本一致:

  1. package com.hb3.pack_09;

  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import java.util.Iterator;

  5. import org.hibernate.Query;
  6. import org.hibernate.Session;
  7. import org.hibernate.SessionFactory;
  8. import org.hibernate.Transaction;
  9. import org.hibernate.cfg.Configuration;

  10. import com.hb3.pack_09.model.DefaultUser;
  11. import com.hb3.pack_09.model.PowerUser;
  12. import com.hb3.pack_09.model.User;

  13. public class BusinessService {

  14.     public static void main(String[] args) throws IOException, SQLException {
  15.         
  16.         Configuration config = new Configuration().configure();
  17.         SessionFactory sessionFactory = config.buildSessionFactory();      
  18.         Session session = sessionFactory.openSession();

  19.         
  20.         DefaultUser defaultUser = new DefaultUser();
  21.         defaultUser.setName("chenyan");
  22.         defaultUser.setSomeProperty("hu....hu...");
  23.    
  24.         PowerUser powerUser = new PowerUser();
  25.         powerUser.setName("shenbin");
  26.         powerUser.setOtherProperty("Bla...Bla...");

  27.         Transaction tx = session.beginTransaction();        
  28.         session.save(powerUser); 
  29.         session.save(defaultUser);      
  30.         tx.commit();
  31.         
  32.         
  33.         session.close();
  34.         session = sessionFactory.openSession();
  35.         
  36.         
  37.         Query query = session.createQuery("from com.hb3.pack_09.model.User");
  38.         Iterator<?> iterator = query.list().iterator();
  39.         while(iterator.hasNext()) {
  40.                 User user = (User) iterator.next();
  41.                 System.out.println(user.getName());
  42.         }
  43.         
  44.         
  45.         session.close();
  46.         sessionFactory.close();
  47.     }
  48. }

3.Table per subclass

数据表设计如下图:

DDL文件:

  1. CREATE TABLE user (
  2.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  3.     name VARCHAR(100) NOT NULL default ''
  4. );

  5. CREATE TABLE defaultuser (
  6.     id INT(11) NOT NULL PRIMARY KEY,
  7.     someProperty VARCHAR(100)
  8. );

  9. CREATE TABLE poweruser (
  10.     id INT(11) NOT NULL PRIMARY KEY,
  11.     otherProperty VARCHAR(100)
  12. );

POJO同上,分为:User,PowerUser,DefaultUser。

User.hbm.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE hibernate-mapping 
  3.     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

  5. <hibernate-mapping> 

  6.     <class name="com.hb3.pack_10.model.User" table="user"> 
  7.     
  8.         <id name="id" column="id" type="java.lang.Integer"> 
  9.             <generator class="native"/> 
  10.         </id> 
  11.         
  12.         <property name="name" column="name" type="java.lang.String"/> 

  13.         <joined-subclass name="com.hb3.pack_10.model.DefaultUser" 
  14.                          table="defaultuser">
  15.                          
  16.             <key column="id"/>           
  17.                
  18.             <property name="someProperty" 
  19.                       column="someProperty" 
  20.                       type="java.lang.String"/> 
  21.                       
  22.         </joined-subclass> 
  23.         
  24.         <joined-subclass name="com.hb3.pack_10.model.PowerUser" 
  25.                          table="poweruser">
  26.                          
  27.             <key column="id"/> 
  28.                          
  29.             <property name="otherProperty" 
  30.                       column="otherProperty" 
  31.                       type="java.lang.String"/> 
  32.                       
  33.         </joined-subclass>  
  34.             
  35.     </class> 
  36.     
  37. </hibernate-mapping>

修改hibernate.cfg.xml文件:

......

<mapping resource="com/hb3/pack_10/model/User.hbm.xml" />

......

 

测试代码如下:

  1. package com.hb3.pack_10;

  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import java.util.Iterator;

  5. import org.hibernate.Query;
  6. import org.hibernate.Session;
  7. import org.hibernate.SessionFactory;
  8. import org.hibernate.Transaction;
  9. import org.hibernate.cfg.Configuration;

  10. import com.hb3.pack_10.model.DefaultUser;
  11. import com.hb3.pack_10.model.PowerUser;
  12. import com.hb3.pack_10.model.User;

  13. public class BusinessService {

  14.     public static void main(String[] args) throws IOException, SQLException {
  15.         
  16.         Configuration config = new Configuration().configure();
  17.         SessionFactory sessionFactory = config.buildSessionFactory();      
  18.         Session session = sessionFactory.openSession();

  19.         
  20.         DefaultUser defaultUser = new DefaultUser();
  21.         defaultUser.setName("chenyan");
  22.         defaultUser.setSomeProperty("hu....hu...");
  23.    
  24.         PowerUser powerUser = new PowerUser();
  25.         powerUser.setName("shenbin");
  26.         powerUser.setOtherProperty("Bla...Bla...");

  27.         Transaction tx = session.beginTransaction();        
  28.         session.save(powerUser); 
  29.         session.save(defaultUser);      
  30.         tx.commit();
  31.         
  32.         
  33.         session.close();
  34.         session = sessionFactory.openSession();
  35.         
  36.         
  37.         Query query = session.createQuery("from com.hb3.pack_10.model.User");
  38.         Iterator<?> iterator = query.list().iterator();
  39.         while(iterator.hasNext()) {
  40.                 User user = (User) iterator.next();
  41.                 System.out.println(user.getName());
  42.         }
  43.         
  44.         
  45.         session.close();
  46.         sessionFactory.close();
  47.     }
  48. }


ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程