如何在hibernate中扩展类,通过hbm映射引用同一个表中的一行?

时间:2014-10-14 06:10:41

标签: java hibernate extends polymorphism

我的课程ActivityLinkActivity延伸。 ActivityLinkprivate Activity link;属性,我不想要触摸表Activity,但我想创建第二个表ActivityLink。我使用Java 1.7和最新版本的hibernate。

如何通过xml映射在hibernate中实现它?

public class ActivityLink extends Activity implements Serializable {
    private static final long serialVersionUID = 1L;
    private Activity link;

    public ActivityLink( Activity link ){  this.link = link; }

    //    getter en setter
}

public class Activity implements Serializable {
    private static final long serialVersionUID = 1L;
    private String identity;
    public Character precision;
    public Date requestedTime;
    public Date effectiveTime;
    public String performerId;
    public Date schedulerTime;
    public Double fractionQty;
    public Short UserId;
    public Double totalVolume;
    public Double restVolume;

    public Activity() {    }

//    getter en setter
    }

Activity.hbm.xml文件:

<?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="de.j2ee.order.ActivityLink"
           table="order_db..ActivityLink">
    <composite-id class="de.j2ee.order.PK" name="pk">
      <key-property name="identity" column="Identity_" access="field"/>
    </composite-id>
    <version name="version" column="Version_" access="field" type="java.lang.Long"/>
    <property name="identity" column="Identity_" update="false" insert="false"/>
    <property name="precision" column="Precision_"/>
    <property name="requestedTime" column="RequestedTime_"/>
    <property name="effectiveTime" column="EffectiveTime_"/>
    <property name="performerId" column="PerformerId_"/>
    <property name="schedulerTime" column="SchedulerTime_"/>
    <property name="fractionQty" column="FractionQty_"/>
    <property name="userId" column="UserId_"/>
    <property name="totalVolume" column="TotalVolume_"/>
    <property name="restVolume" column="RestVolume_"/>

    <union-subclass name="de.j2ee.order.ActivityLink" table="order_db..Activity">
          <property name="link"  />
    </union-subclass>-->

  </class>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:0)

如果要对ActivityActivityLink使用单个表,则必须使用Table Per Class层次结构策略。请点击以下链接了解详情:

10.1.1. Table per class hierarchy

所以你的映射应该是这样的:

<class name="Activity" table="Activity">
    <id name="identity" column="Identity">
    </id>
    <discriminator column="ACTIVITY_TYPE" type="string"/>
    <subclass name="ActivityLink" discriminator-value="Activity_Link">
        ...
    </subclass>
</class>

<强>更新

如果您想为子类ActivityLink创建一个表,那么您需要使用以下策略:

10.1.2. Table per subclass

例如:

<class name="Activity" table="Activity">
    <id name="identity" column="Identity">
    </id>
    <joined-subclass name="ActivityLink" table="Activity_Link">
        <key column="Activity_ID"/>
        ...
    </joined-subclass>
</class>