关闭

整个继承树映射到一张表

265人阅读 评论(0) 收藏 举报

人类(Person)  , 男人(Men)继承"人"类, 女人(Women)继承"人"类,  UML如下:
















映射到如下的t_person表中, 有以下6个字段:

1 int  id                             //主键

2 varchar  name                 //父类中的姓名

3 int  age                          //父类中的年龄      

4 int/varchar   type             //区分"人","男人","女人"  的专用字段, 默认类型是varchar, 也可以指定为int类型.  叫鉴别器字段

                                                           //Person类:type值设为0, Men类:type值设为1, Women类:type值设为2


5 varchar   a                      //"男人"类专有属性   

6 varchar   b                      //"女人"类专有属性    

Person, Men, Women 三个类这里就不显示了,但简单, 想看了附件中有源码

Person.hbm.xml 如下:

Xml代码  收藏代码
  1. <?xml version="1.0"?>  
  2.  
  3. <!DOCTYPE hibernate-mapping PUBLIC   
  4.  
  5.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  6.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  7.  
  8. <hibernate-mapping   
  9.   
  10.   
  11.     package="extends_test.extends_1" auto-import="false">  
  12.   
  13.     <class name="Person" table="t_person" discriminator-value="0"><!-- "鉴别值"为0 -->  
  14.   
  15.   
  16.         <!-- 父类的属性 -->          
  17.   
  18.   
  19.         <id name="id">  
  20.   
  21.   
  22.             <generator class="native"/>  
  23.   
  24.   
  25.         </id>   
  26.   
  27.         <!-- 重点:鉴别器 -->  
  28.   
  29.   
  30.         <!-- 指定type字段,做区分父子具体类型用 ,各类还要指定"鉴别值": discriminator-value="1"-->  
  31.   
  32.   
  33.         <discriminator column="type" type="int"/>           
  34.  
  35.         <!-- 父类的属性 -->  
  36.   
  37.   
  38.         <property name="name"/>  
  39.   
  40.   
  41.         <!-- 父类的属性 -->  
  42.   
  43.   
  44.         <property name="age"/>        
  45.   
  46.         <!-- Mem子类的映射 -->  
  47.  
  48.         <subclass name="Men" discriminator-value="1"><!-- "鉴别值"为1 -->  
  49.   
  50.   
  51.             <!-- Men类专有的属性a -->  
  52.   
  53.   
  54.             <property name="a"/>  
  55.   
  56.   
  57.         </subclass>  
  58.         <!-- Women子类的映射 -->
  59.         <subclass name="Women" discriminator-value="2"><!-- "鉴别值"为2 -->  
  60.   
  61.   
  62.             <!-- Women类专有的属性b -->  
  63.   
  64.   
  65.             <property name="b"/>  
  66.   
  67.   
  68.         </subclass>  
  69.   
  70.   
  71.     </class>    
  72.   
  73.   
  74. </hibernate-mapping>

保存与查询操作:

Java代码  收藏代码
  1. package extends_test.extends_1;  
  2. import org.hibernate.Session;  
  3. import org.hibernate.Transaction;  
  4. import dao.HibernateUtil;  
  5. /** 
  6.  * 继承关系的映射(方法一) 
  7.  *  
  8.  * 总个继承树映射到一张表
  9.  * 
  10.  */
  11.   
  12. public class Test
  13. {
  14.     /** 
  15.      * @param args
  16.      */  
  17.     public static void main(final String[] args)  
  18.     {  
  19.         //add();  
  20.         query();  
  21.     }
  22.     /**
  23.      * 查询测试
  24.      */
  25.   
  26.     public static void query()  
  27.     {
  28.         Session session = null;  
  29.         try
  30.   
  31.         {
  32.             session = HibernateUtil.getSeesion();  
  33.   
  34.   
  35.             final Person p = (Person) session.get(Person.class2); //ID为2的记录是  Men类型  
  36.   
  37.   
  38.             System.out.println(p.getClass());  
  39.   
  40.   
  41.             //get()第一个参数用了 Person.class  
  42.   
  43.   
  44.             //能识别出是class extends_test.extends_1.Men类型  
  45.         }
  46.         finally  
  47.         {  
  48.             if (session != null)  

  49.             {
  50.                 session.close();
  51.             }
  52.         }
  53.     }
  54.   
  55.     /**
  56.      * 添加测试 
  57.      */
  58.     public static void add()  
  59.     {  
  60.         final Person p1 = new Person();  

  61.         p1.setName("我是Person类");  
  62.  
  63.         final Men m1 = new Men();  

  64.         m1.setName("我是男人类");  

  65.         m1.setA("a");  

  66.         final Women w1 = new Women();  
  67.         w1.setName("我是女人类");  
  68.         w1.setB("b");  
  69.         Session session = null;  
  70.         try
  71.         {  
  72.             session = HibernateUtil.getSeesion();  
  73.  
  74.             final Transaction tx = session.beginTransaction();  
  75.  
  76.             session.save(p1);  
  77.  
  78.             session.save(m1);  
  79.  
  80.             session.save(w1);  

  81.             tx.commit();  

  82.             //SQL如下 
  83.             //Hibernate: insert into t_person (name, age, type) values (?, ?, 0)  
  84.   
  85.   
  86.             //Hibernate: insert into t_person (name, age, a, type) values (?, ?, ?, 1)  
  87.   
  88.   
  89.             //Hibernate: insert into t_person (name, age, b, type) values (?, ?, ?, 2)  

  90.         }  
  91.         finally  
  92.         {  
  93.             if (session != null)  
  94.             {
  95.                 session.close();  
  96.             }  
  97.         }  
  98.     }  


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1058808次
    • 积分:8332
    • 等级:
    • 排名:第2476名
    • 原创:125篇
    • 转载:448篇
    • 译文:3篇
    • 评论:35条
    最新评论