`
Wind_ZhongGang
  • 浏览: 259727 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate ORM Inheritance

阅读更多

  Hibernate ORM提供了三种继承映射策略。第一种是父类和子类由一张表来表示,第二种则是具有继承关系的每个类各由一张表表示,第三种是所有具体类,即是子类各由一张表表示,而父类在数据库中则没有表对应。假设有这样几个持久化实体:父类A,它有两个子类,分别为B和C。那么按照第一种策略,A,B,C所有类的持久化信息都是在数据库中的一张表存储的,而按照第二种策略,A,B,C各个类在数据库中都有自己的一张表对应,按照第三种策略,B,C子类在数据库中各有自己的一张表对应,而A类父类则是没有的。各个继承映射策略在配置上又有什么不同呢?

 

  一。Person.java

 

package com.template.model.inheritance;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-31
 * Time: 下午9:00
 */
public class Person {
    private Integer id;
    private String name;
    private String address;

    public Person() {
    }
}

 

  二。Employee.java

 

package com.template.model.inheritance;

import org.joda.time.LocalDate;

import java.math.BigDecimal;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-31
 * Time: 下午9:04
 */
public class Employee extends Person {
    private LocalDate fromDate;
    private BigDecimal salary;

    public Employee() {
    }
}

 

  三。Applicant.java

 

package com.template.model.inheritance;

import java.math.BigDecimal;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-7-31
 * Time: 下午9:12
 */
public class Applicant extends Person {
    private String lastCompany;
    private BigDecimal expectedSalary;

    public Applicant() {
    }
}

 

 

  四。第一种策略的映射配置文件 subclass

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.model.inheritance.Person" table="person" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <discriminator column="ptype" type="java.lang.String"/>

        <property name="name"  column="name" type="java.lang.String"/>
        <property name="address"  column="address" type="java.lang.String"/>
    </class>
    <subclass name="com.template.model.inheritance.Employee" discriminator-value="employee" extends="com.template.model.inheritance.Person">
       <property name="fromDate" column="fromdate" type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
       <property name="salary" column="salary" type="java.math.BigDecimal"/>
    </subclass>
    <subclass name="com.template.model.inheritance.Applicant" discriminator-value="applicant" extends="com.template.model.inheritance.Person">
        <property name="lastCompany" column="lastcompany" type="java.lang.String"/>
        <property name="expectedSalary" column="expectedsalary" type="java.math.BigDecimal"/>
    </subclass>

</hibernate-mapping>

 

  五。第一种策略的数据库表

  subclass

 

  六。第二种策略的映射文件配置

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.model.inheritance.Person" table="person" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>

        <property name="name"  column="name" type="java.lang.String"/>
        <property name="address"  column="address" type="java.lang.String"/>
    </class>

    <joined-subclass name="com.template.model.inheritance.Employee" extends="com.template.model.inheritance.Person" table="employee">
        <key column="personid"/>
        <property name="fromDate" column="fromdate" type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
        <property name="salary" column="salary" type="java.math.BigDecimal"/>
    </joined-subclass>

    <joined-subclass name="com.template.model.inheritance.Applicant" extends="com.template.model.inheritance.Person" table="applicant">
        <key column="personid"/>
        <property name="lastCompany" column="lastcompany" type="java.lang.String"/>
        <property name="expectedSalary" column="expectedsalary" type="java.math.BigDecimal"/>
    </joined-subclass>

</hibernate-mapping>
 

  七。第二种策略的数据库表

  joined subclass

 

  八。第三种策略的映射文件配置

 

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.model.inheritance.Person" abstract="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="increment"/>
        </id>

        <property name="name"  column="name" type="java.lang.String"/>
        <property name="address"  column="address" type="java.lang.String"/>
    </class>

    <union-subclass name="com.template.model.inheritance.Employee" extends="com.template.model.inheritance.Person" table="employee">
        <property name="fromDate" column="fromdate" type="org.joda.time.contrib.hibernate.PersistentLocalDate"/>
        <property name="salary" column="salary" type="java.math.BigDecimal"/>
    </union-subclass>

    <union-subclass name="com.template.model.inheritance.Applicant" extends="com.template.model.inheritance.Person" table="applicant">
        <property name="lastCompany" column="lastcompany" type="java.lang.String"/>
        <property name="expectedSalary" column="expectedsalary" type="java.math.BigDecimal"/>
    </union-subclass>

</hibernate-mapping>

 

  九。第三种映射策略数据库表

  union class

 

  • 大小: 13.9 KB
  • 大小: 23.8 KB
  • 大小: 19.4 KB
2
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics