Chinaunix首页 | 论坛 | 博客
  • 博客访问: 547658
  • 博文数量: 136
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1343
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 23:18
文章分类

全部博文(136)

文章存档

2011年(28)

2009年(60)

2008年(48)

我的朋友

分类: Java

2009-02-12 17:11:19

Hibernate的继承映射包含了三种不同的策略:
  1. 每簇类使用一个表;
  2. 每个子类一个表;
  3. 每个具体内一个表(有限制)。
假设我们有四个类Animal,Dog,Cat,其代码如下:
文件名:Animal.java


class Animal {
    
private String identifier;
    
private String name;
    
private String category;
    
// setter and getter
}

文件名:Dog.java
class Dog extends Animal {
    
private String 
    
// setter and getter
}

文件名:Cat.java
class Cat extends Animal {
    
private String 
    
// setter and getter
}

  • 每簇类使用一个表
       使用每簇类使用一个表的策略时,有一个限制就时子类不能有NOT NULL,映射文件为:
       文件名:Animal.hbm.xml
       <class name="Animal" table="TB_ANIMAL">
          
<id name="identifier" type="string" column="IDENTIFIER">
             
<generator class="uuid.hex"/>
          
id>
          
<discriminator column="ANIMAL_TYPE" type="string"/>
          
<property name="name" column="NAME" type="string"/>
          
          
<subclass name="Dog" discriminator-value="DOG">
             
          
subclass>
          
<subclass name="Cat" discriminator-value="CAT">
             
          
subclass>
       
class>

  • 每个子类一个表
       使用每个子类一个表的策略时,可以使用一个映射文件实现,也可以分成多个映射文件来实现。每个子类一个映射文件的情况:
       文件名:Animal.hbm.xml
       <class name="Animal" table="ANIMAL">
          
<id name="identifier" column="IDENTIFIER" type="string">
             
<generator class="uuid.hex"/>
          
id>
          
<property >
       
class>
       文件名:Dog.hbm.xml
       
<joined-subclass name="Dog" table="DOG" extends="Animal">
          
<key column="DOG_ID"/>
          
       
joined-subclass>
       文件名:Cat.hbm.xml
       
<joined-subclass name="Cat" table="CAT" extends="Cat">
          
<key column="CAT_ID"/>
          
       
joined-subclass>

       每个子类一个表的策略实际上一种one-to-one的映射。
  • 每个具体内一个表(有限制)
       使用每个具体内一个表(有限制)策略时,每一个子类的映射文件将要包含所有父类中的属性,映射文件:
       文件名:Dog.hbm.xml
       <class name="Dog" table="DOG">
          
<id name="identifier" column="IDENTIFIER" type="string">
             
<generator class="uuid.hex"/>
          
id>
          
<property name="name" column="NAME" type="string"/>
          
       
class>
       文件名:Cat.hbm.xml
       
<class name="Cat" table="CAT">
          
<id name="identifier" column="IDENTIFIER" type="string">
             
<generator class="uuid.hex"/>
          
id>
          
<property name="name" column="NAME" type="string"/>
          
       
class>


第二个例子

新建一个类,包名:javamxj.inheritance.two,类名:Animal。然后在生成的代码中添加变量,再利用“生成 Getter 和 Setter”,具体方式同《Eclipse快速上手Hibernate--1. 入门实例 》文章中的编辑User.java的方式一样。

·  这个类是父类,只是生成一个简单的表。

Vehicle.java

 

/* * Hibernate - 继承映射(每个子类一个表) * 创建日期 2005-4-9 * @author javamxj(分享java快乐) * @link Blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */

package javamxj.inheritance.two;

/** * @hibernate.class */

public class Vehicle {    

  private Long id;    

  private String name;    

/**     * @hibernate.id      * column="ID"      * generator-class="hilo"      * unsaved-value="null"     */    

  public Long getId() {        

     return id;    

  }    

  public void setId(Long id) {        

     this.id = id;    

  }    

/**     * @hibernate.property      * length = "24"     */    

  public String getName() {        

    return name;    

  }    

  public void setName(String name) {         

    this.name = name;    

  }

}

 

·  子类Car.java
Car.java

package javamxj.inheritance.two;

/** * @hibernate.joined-subclass * @hibernate.joined-subclass-key * column="id" */

public class Car extends Vehicle {    

  private String seat;    

  /**     * @hibernate.property     

          * column = "载客"     

          * length = "24"    

  */    

  public String getSeat() {        

    return seat;    

  }    

  public void setSeat(String seat) {        

    this.seat = seat;    

  }

}
 

 

·  子类Truck.java
Truck.java

package javamxj.inheritance.two;

/** * @hibernate.joined-subclass

    * @hibernate.joined-subclass-key

    * column="id"

*/

public class Truck extends Vehicle {    

  private String load;    

  /**     * @hibernate.property     

          * column = "载重"     

          * length = "24"    

 */    

  public String getLoad() {        

    return load;    

  }    

  public void setLoad(String load) {     

    this.load = load;    

  }

}
 

 

· 这两个子类都很简单,注意添加的hibernate.joined-subclass的标记。

3. 运行任务
 
·  双击“generate-hbm”任务,会发现在包中多了一个Vehicle.hbm.xml文件。如果没有,按F5键刷新一下(这里建议打开Eclipse的“首选项”对话框,在“工作台”中勾选“自动刷新工作空间”和“在构建之前自动保存”这两项,这样以后不用每次都刷新了)。

Vehicle.hbm.xml

 

<?xml version="1.0" encoding="GBK"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "">

<hibernate-mapping>

  <class name="javamxj.inheritance.two.Vehicle"

        dynamic-update="false" dynamic-insert="false"

        select-before-update="false" optimistic-lock="version"

  >

    <id name="id" column="ID" type="java.lang.Long"

        unsaved-value="null"

    >

      <generator class="hilo">

      <!-- To add non XDoclet generator parameters,

           create a file named hibernate-generator-params-

           Vehicle.xml containing the additional parameters

           and place it in your merge dir.

      -->

      </generator>

    </id>

    <property name="name" type="java.lang.String" update="true"

           insert="true" access="property" column="name"

           length="24" />

    <!-- To add non XDoclet property mappings, create a file named

      hibernate-properties-Vehicle.xml containing the additional

      properties and place it in your merge dir.

    -->

    <joined-subclass name="javamxj.inheritance.two.Truck"

            dynamic-update="false" dynamic-insert="false"

    >

      <key column="id" />

      <property name="load" type="java.lang.String" update="true"

            insert="true" access="property" column="载重"

            length="24"

      />

    </joined-subclass>

    <joined-subclass name="javamxj.inheritance.two.Car"

            dynamic-update="false" dynamic-insert="false"

    >

      <key column="id" />

      <property name="seat" type="java.lang.String"

            update="true" insert="true" access="property"

            column="载客" length="24"

      /> 

        </joined-subclass>

  </class>

</hibernate-mapping>

 

重点是看看“joined-subclass”标签。

 
· 同时在hibernate.cfg.xml文件中会自动添加一个映射文件信息:
 
 
·  先运行MySQL,然后双击“schemaexport”任务,在项目根目录下,会更新“schema-export.sql”文件。
打开这个文件,会发现添加了以下一些语句。
create table Car (
   id bigint not null,
   载客 varchar(24),
   primary key (id)
)
create table Truck (
   id bigint not null,
   载重 varchar(24),
   primary key (id)
)
create table Vehicle (
   ID bigint not null,
   name varchar(24),
   primary key (ID)
)
 
·  切换到数据库中,会发现已经自动产生了数据表Car、Truck、Vehicle。
· 将数据表与映射文件Vehicle.hbm.xml对照看看,可以更好的理解每个子类一个表的策略。
阅读(593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~