Hibernate继承映射

来源:互联网 发布:刀塔传奇攻略软件 编辑:程序博客网 时间:2024/06/07 00:54

继承映射

 

三种方式,继承关系映射到数据库的表中

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

 

 

 

原创粉丝点击