每個子類一個表的方式是將所有的類生成一個表(包括父類),保存子類的時候,同時向父類和子類添加數(shù)據(jù),然后把父類中生成的id,保存到子類中,保持關(guān)聯(lián)。在這個主題中我們將先說明這個方法。


一個例子如下:
·  類Vehicle.java

package com.jason.inheritance.two;

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

package com.jason.inheritance.two;

public class Car extends Vehicle {
 private String seat;
 public String getSeat() {
  return seat;
 }

 public void setSeat(String seat) {
  this.seat = seat;
 }
}


·  子類Truck.java

package com.jason.inheritance.two;

public class Truck extends Vehicle {
 private String load;
 public String getLoad() {
  return load;
 }

 public void setLoad(String load) {
  this.load = load;
 }
}



·  Vehicle.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "
<hibernate-mapping>
 <class name="com.jason.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">
    
   </generator>
  </id>
  
  <property name="name" type="java.lang.String" update="true" insert="true"
   access="property" column="name" length="24"/>
  
  <joined-subclass name="com.jason.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="loads" length="24"/>
   
  </joined-subclass>
  <joined-subclass name="com.jason.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="seat" length="24"/>
   
  </joined-subclass>
  
 </class>
 
</hibernate-mapping>


      顯然對應(yīng)的表是
      vehicle(id, name)        car(id, seat)          truck(id, loads)   
      需要注意的是:car/truck 中的id 和vehicle中的id是一一對應(yīng)的。    
      /*
      Truck truck = new Truck();
      truck.setName("西風(fēng)卡車");
      truck.setLoad("10ton");
      sess.save(truck);*/
   插入記錄的sql如下:
   Hibernate: insert into Vehicle (name, ID) values (?, ?)
   Hibernate: insert into Truck (loads, id) values (?, ?)
   保存一條truck信息,要先在Vehicle中保存記錄,得到id,然后把得到的id和需要的值一同保存到Truck中。


● 優(yōu)點:
· 與面向?qū)ο蟮母拍畹囊恢滦宰詈谩Χ鄳B(tài)的支持最好,對于對象所可能充當?shù)慕巧珒H需要在相應(yīng)的表中保存記錄。
· 易于修改基類和增加新的類。
· 這種映射幾乎有最佳的空間節(jié)約性。唯一的容易就是額外的OID,來連接不同的層級層次。

● 缺點:
· 數(shù)據(jù)庫中存在大量的表。
· 訪問數(shù)據(jù)的時間較長。在讀寫相關(guān)的任務(wù)上,這種映射方式相當費資源,這個代價還隨著繼承層次的增多而增大。
· 對報表的支持較差,除非定義視圖。












參考:

· HIBERNATE - 符合Java習(xí)慣的關(guān)系數(shù)據(jù)庫持久化(第8章)