每個子類一個表的方式是將所有的類生成一個表(包括父類),保存子類的時候,同時向父類和子類添加數據,然后把父類中生成的id,保存到子類中,保持關聯。在這個主題中我們將先說明這個方法。
一個例子如下:
· 類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
顯然對應的表是
vehicle(id, name) car(id, seat) truck(id, loads)
需要注意的是:car/truck 中的id 和vehicle中的id是一一對應的。
/*
Truck truck = new Truck();
truck.setName("西風卡車");
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中。
● 優點:
· 與面向對象的概念的一致性最好。對多態的支持最好,對于對象所可能充當的角色僅需要在相應的表中保存記錄。
· 易于修改基類和增加新的類。
· 這種映射幾乎有最佳的空間節約性。唯一的容易就是額外的OID,來連接不同的層級層次。
● 缺點:
· 數據庫中存在大量的表。
· 訪問數據的時間較長。在讀寫相關的任務上,這種映射方式相當費資源,這個代價還隨著繼承層次的增多而增大。
· 對報表的支持較差,除非定義視圖。
參考:
· HIBERNATE - 符合Java習慣的關系數據庫持久化(第8章)