我们可以在Hibernate中的每个层次结构的表中使用鉴别器作为多对一关系

时间:2013-12-16 07:16:22

标签: java database hibernate database-design hibernate-mapping

我使用hibernate在我的应用程序中创建了Device表。每个Device对象包含3种类型的对象,例如SADevicedeTXDeviceTypeRxDeviceType。 (即)设备具有SADeviceType,TXDeviceType,RxDeviceType

的列表

我的目标是为每个具有用户定义限制的SADevicetype,TXDeviceType和RxDeviceType生成警报。这意味着设备A的 SADeviceType仅应生成重大错误。设备A的 TXDeviceType应仅针对次要错误生成。 设备B的 SADeviceType,TXDeviceType应为主要和次要错误生成警报。

我想在此使用 Table Per class hierarchy 。例如,我想创建AlarmRestrictionDetail类,子类是SAAlarmDetail,TXAlarmDetail和RxAlarmDetail。如果我要通过使用hibernate创建它,如果每个类层次结构中的歧视器作为多对一关系出现,它将如何处理 如何在一个鉴别器列上生成三个外键?

如果这不是一个好主意,当我使用hibernate时,是否有人帮助我哪种表结构最好?

参考代码在

下面
  public class Device {
        private Integer id;
        private List<SADevicetype> saDeviceTypeList;
        private List<RxDeviceType> rxDeviceTypeList;
        private List<TXDeviceType> txDeviceTypeList;
  }

  public class AlarmRestrictionDetail {
    public Integer id;
    public String alarmName;
    public String severity;
  }

  public class SAAlarmDetail extends AlarmRestrictionDetail{

    // device type is a discriminator column 
    public SADevicetype deviceType;
  }

  public class  TXAlarmDetail extends AlarmRestrictionDetail {

    // device type is a discriminator column 
    public TXDeviceType deviceType;
  }

1 个答案:

答案 0 :(得分:0)

One Table Per class hierarchy方法中,如果需要在代码中使用discriminator的值,则可以在映射中使用read-only属性。

public enum Devicetype {SADevicetype("SA") ,TXDeviceType("TX")  ,...}
public class AlarmRestrictionDetail {
    public Integer id;
    public String alarmName;
    public String severity;
    public Devicetype deviceType;
  }

 <class name="AlarmRestrictionDetail " table="AlarmRestrictionDetailTable">
    <id name="ID" column="id"/>    
    <property name="alarmName" column="severity" length="50"></property>
    <property name="severity" column="severity" length="50"></property>

    <discriminator column="discriminator_column" type="string"/>
    <property name="devicetype"  column="discriminator_column" access="readonly"/>

    <subclass name="SAAlarmDetail " discriminator-value="SA">
    <!-- ETC-->
    </subclass>
    <subclass name="TXAlarmDetail" discriminator-value="TX">
    <!-- ETC-->
    </subclass>       
  </class>