继承映射
三种方式,继承关系映射到数据库的表中
A.继承关系层次一个表(Table per class hierarchy),这种方式使用一个表存储同一个继承层次的所有类,使用额外的字段来表示所记录的是哪一个子类的数据
B.每个具体类一个表(Table per concrete class),这种方式让继承关系中的每个具体类对应一个表
C.每个子类一个表(Table per subclass),这种方式让继承关系中的父类分别对应一个表,父类与子类对应的表通过外键产生关系
详细介绍这三种方式的用法:
A. 1.一张同样的表:Delivery表
create table DELIVERY
(
ID NUMBER not null,
RECIPIENT VARCHAR2(200),
PHONE VARCHAR2(200),
ADDRESS VARCHAR2(400),
POSTCODE VARCHAR2(10),
DELVERY_TYPE VARCHAR2(20), //类型.如果值为POST则为POSTDelivery,如果是EXPRESS则为 //EXPRESSDelivery
PARCEL_NUMBER VARCHAR2(30),
EXPRESS_NUMBER VARCHAR2(30),
EXPRESS_COMPANY VARCHAR2(40)
)
2.三个类,分别为: Delivery类/postDelivery/expressDelivery
Delivery.java
package com.util.deliery;
public class Delivery {
private int id;
private String recipient;
private String phone;
private String address;
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
}
PostDelivery.java
package com.util.deliery;
public class PostDelivery extends Delivery {
private String parceNumber;
public String getParceNumber() {
return parceNumber;
}
public void setParceNumber(String parceNumber) {
this.parceNumber = parceNumber;
}
}
ExpressDelivery.java
package com.util.deliery;
public class ExpressDelivery extends Delivery {
private String expressNumber;
private String expressCompany;
public String getExpressCompany() {
return expressCompany;
}
public void setExpressCompany(String expressCompany) {
this.expressCompany = expressCompany;
}
public String getExpressNumber() {
return expressNumber;
}
public void setExpressNumber(String expressNumber) {
this.expressNumber = expressNumber;
}
}
Delivery.hbm.xml配置文件:
<hibernate-mapping>
<class name="com.util.deliery.Delivery" table="DELIVERY"
schema="TEST">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
<discriminator column="delivery_type"></discriminator> /*说明delivery_type 来区分是POST还是EXPRESS*/
<property name="recipient" type="java.lang.String">
<column name="RECIPIENT" length="200" />
</property>
<property name="phone" type="java.lang.String">
<column name="PHONE" length="200" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="400" />
</property>
<property name="postcode" type="java.lang.String">
<column name="POSTCODE" length="10" />
</property>
/*配置POST专属的属性,若为delivery_type=”Post”则为PostDelivery */
<subclass name="com.util.deliery.PostDelivery"
discriminator-value="Post">
<property name="parcelNumber" type="java.lang.String">
<column name="PARCEL_NUMBER" length="30" />
</property>
</subclass>
/*配置Express专属的属性,若为delivery_type=” Express”则为ExpressDelivery */
<subclass name="com.util.deliery.ExpressDelivery"
discriminator-value="Express">
<property name="expressNumber" type="java.lang.String">
<column name="EXPRESS_NUMBER" length="30" />
</property>
<property name="expressCompany" type="java.lang.String">
<column name="EXPRESS_COMPANY" length="40" />
</property>
</subclass>
</class>
</hibernate-mapping>
测试类:HibernateTest.java
public class HibernateTest {
/**
* @param args
*/
public static void main(String[] args) {
new HibernateTest().insertDelivery();
new HibernateTest().listDelivery();
}
public void listDelivery() {
Session session = HibernateSessionFactory.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("form PostDelivery");
List<PostDelivery> list = query.list();
session.getTransaction().commit();
for (PostDelivery d : list) {
System.out.println(d.getRecipient());
System.out.print(d.getParcelNumber());
}
}
public void insertDelivery(){
PostDelivery post=new PostDelivery();
post.setRecipient("WO");
post.setAddress("NB");
post.setPhone("8856216");
post.setPostcode("315000");
post.setParcelNumber("8576");
ExpressDelivery express=new ExpressDelivery();
express.setRecipient("NI");
express.setAddress("NB");
express.setPhone("8856216");
express.setPostcode("315000");
express.setExpressCompany("NBWD");
express.setExpressNumber("5782");
Session session=HibernateSessionFactory.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(post);
session.save(express);
session.getTransaction().commit();
}
}
A. 每个具体类一个表
Post_delivery 表:
字段id <pk> ,recipient,phone,address,postcode,parcel_number
Express_delivery表:
字段:id<pk>,recipient,phone,address,postcode,express_company,express_number
类Delivery(抽象类)
public abstract class Delivery implements java.io.Serializable{
private Integer id;
private String recipient;
private String phone;
private String address;
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
PostDelivery.java
public class PostDelivery extends Delivery {
private String parcelNumber;
public String getParcelNumber() {
return parcelNumber;
}
public void setParcelNumber(String parcelNumber) {
this.parcelNumber = parcelNumber;
}
}
ExpressDelivery.java
public class ExpressDelivery extends Delivery {
private String expressNumber;
private String expressCompany;
public String getExpressCompany() {
return expressCompany;
}
public void setExpressCompany(String expressCompany) {
this.expressCompany = expressCompany;
}
public String getExpressNumber() {
return expressNumber;
}
public void setExpressNumber(String expressNumber) {
this.expressNumber = expressNumber;
}
}
Delivery.hbm.xml
<hibernate-mapping>
<class name="com.util.deliery.Delivery" table="DELIVERY"
schema="TEST" abstract="true"> /*抽象类*/
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
<property name="recipient" type="java.lang.String">
<column name="RECIPIENT" length="200" />
</property>
<property name="phone" type="java.lang.String">
<column name="PHONE" length="200" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="400" />
</property>
<property name="postcode" type="java.lang.String">
<column name="POSTCODE" length="10" />
</property>
/*对应的post_delivery表*/
<union-subclass name="com.util.deliery.PostDelivery" table="post_delivery">
<property name="parcelNumber" type="java.lang.String">
<column name="PARCEL_NUMBER" length="30" />
</property>
</union-subclass>
/*对应的express_delivery表*/
<union-subclass name="com.util.deliery.ExpressDelivery" table="express_delivery">
<property name="expressNumber" type="java.lang.String">
<column name="EXPRESS_NUMBER" length="30" />
</property>
<property name="expressCompany" type="java.lang.String">
<column name="EXPRESS_COMPANY" length="40" />
</property>
</union-subclass>
</class>
</hibernate-mapping>
主鍵值:select max(ids_.id)
From (
Select
Id
From
Post_delivery
Union
Select
Id
From
Express_delivery
) ids_
效率比較低
A. 每个具体类一个表
Post_delivery 表:
字段id <pk> ,recipient,phone,address,postcode,parcel_number
Express_delivery表:
字段:id<pk>,recipient,phone,address,postcode,express_company,express_number
类Delivery(抽象类)
public abstract class Delivery implements java.io.Serializable{
private Integer id;
private String recipient;
private String phone;
private String address;
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
PostDelivery.java
public class PostDelivery extends Delivery {
private String parcelNumber;
public String getParcelNumber() {
return parcelNumber;
}
public void setParcelNumber(String parcelNumber) {
this.parcelNumber = parcelNumber;
}
}
ExpressDelivery.java
public class ExpressDelivery extends Delivery {
private String expressNumber;
private String expressCompany;
public String getExpressCompany() {
return expressCompany;
}
public void setExpressCompany(String expressCompany) {
this.expressCompany = expressCompany;
}
public String getExpressNumber() {
return expressNumber;
}
public void setExpressNumber(String expressNumber) {
this.expressNumber = expressNumber;
}
}
Delivery.hbm.xml
<hibernate-mapping>
<class name="com.util.deliery.Delivery" table="DELIVERY"
schema="TEST" abstract="true"> /*抽象类*/
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
<property name="recipient" type="java.lang.String">
<column name="RECIPIENT" length="200" />
</property>
<property name="phone" type="java.lang.String">
<column name="PHONE" length="200" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="400" />
</property>
<property name="postcode" type="java.lang.String">
<column name="POSTCODE" length="10" />
</property>
/*对应的post_delivery表*/
<union-subclass name="com.util.deliery.PostDelivery" table="post_delivery">
<property name="parcelNumber" type="java.lang.String">
<column name="PARCEL_NUMBER" length="30" />
</property>
</union-subclass>
/*对应的express_delivery表*/
<union-subclass name="com.util.deliery.ExpressDelivery" table="express_delivery">
<property name="expressNumber" type="java.lang.String">
<column name="EXPRESS_NUMBER" length="30" />
</property>
<property name="expressCompany" type="java.lang.String">
<column name="EXPRESS_COMPANY" length="40" />
</property>
</union-subclass>
</class>
</hibernate-mapping>
主鍵值:select max(ids_.id)
From (
Select
Id
From
Post_delivery
Union
Select
Id
From
Express_delivery
) ids_
效率比較低
B. 每個類一個表
Delivery表:
字段:id<pk>,pecipient,phone,address,postcode
Post_delivery表:
字段:id<pk,fk>,parcel_number
Express_delivery表:
字段:id<pk,fk>,expresscompany,expressnumber
2.三个类,分别为: Delivery类/postDelivery/expressDelivery
Delivery.java
package com.util.deliery;
public class Delivery {
private int id;
private String recipient;
private String phone;
private String address;
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
}
PostDelivery.java
package com.util.deliery;
public class PostDelivery extends Delivery {
private String parceNumber;
public String getParceNumber() {
return parceNumber;
}
public void setParceNumber(String parceNumber) {
this.parceNumber = parceNumber;
}
}
ExpressDelivery.java
package com.util.deliery;
public class ExpressDelivery extends Delivery {
private String expressNumber;
private String expressCompany;
public String getExpressCompany() {
return expressCompany;
}
public void setExpressCompany(String expressCompany) {
this.expressCompany = expressCompany;
}
public String getExpressNumber() {
return expressNumber;
}
public void setExpressNumber(String expressNumber) {
this.expressNumber = expressNumber;
}
}
Delivery.hbm.xml
<hibernate-mapping>
<class name="com.util.deliery.Delivery" table="DELIVERY"
schema="TEST">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
<property name="recipient" type="java.lang.String">
<column name="RECIPIENT" length="200" />
</property>
<property name="phone" type="java.lang.String">
<column name="PHONE" length="200" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="400" />
</property>
<property name="postcode" type="java.lang.String">
<column name="POSTCODE" length="10" />
</property>
<joined-subclass name="com.util.deliery.PostDelivery" table="post_delivery">
<key column="id" foreign-key=”id”></key>
<property name="parcelNumber" type="java.lang.String">
<column name="PARCEL_NUMBER" length="30" />
</property>
</joined-subclass>
<joined-subclass name="com.util.deliery.ExpressDelivery" table="express_delivery">
<key column="id" foreign-key=”id”></key>
<property name="expressNumber" type="java.lang.String">
<column name="EXPRESS_NUMBER" length="30" />
</property>
<property name="expressCompany" type="java.lang.String">
<column name="EXPRESS_COMPANY" length="40" />
</property>
</joined-subclass>
</class>
</hibernate-mapping>
內連接查詢:
Select postdelive0_id as id0_,
postdelive0_1_.recipient as recipient0_,
...
From post_delivery postdelive0_
Inner join
Delivery postdelive0_1_ on postdelivery0_.id=postdelive0_1.id