Hibernate使用hbm.xml将多个类映射到一个表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate使用hbm.xml将多个类映射到一个表相关的知识,希望对你有一定的参考价值。

我对Hibernate相当新,需要一些hibernate-mapping的帮助。

我有4个不同的类,我想映射到一个表,其中主键由2个不同类的属性组成。同时,我想只将每个类的选定属性映射到本地数据库。我希望避免使用JPA注释,而是在hbm.xml文件中定义映射样式。我怎么做?

请看以下示例:

public class Tenant implements Serializable {
    private final static long serialVersionUID = 1L;
    protected List<Rack> rack;
    protected String type;
    //getters setters
}

public class Rack implements Serializable {
    private final static long serialVersionUID = 1L;        
    protected List<Circuit> circuit;
    protected String rackLabel;
    protected Boolean excludes;
    //getters setters
}

public class Circuit implements Serializable {
    private final static long serialVersionUID = 1L;
    protected List<CircuitReadings> circuitReadings;
    protected String circuitNo;
    protected Boolean excludes;
    //getters setters
}

public class CircuitReadings
    implements Serializable {
    private final static long serialVersionUID = 1L;
    protected String date;
    protected String kva;
    protected String current;
    protected String kwh;
    //getters setters
}

最终表应包含以下内容:

    type | rackLabel | circuitNo | date | kva | current | energy

上面的“circuitNo”和“date”应该形成复合主键。

有人能告诉我一个如何映射这个的例子吗?谢谢!

答案

Hibernate提供了一种使用discriminator关键字映射子类的方法。

<class name="Payment" table="PAYMENT">
    <id name="id" type="long" column="PAYMENT_ID">
        <generator class="native"/>
    </id>
    <discriminator column="PAYMENT_TYPE" type="string"/>
    <property name="amount" column="AMOUNT"/>
    ...
    <subclass name="CreditCardPayment" discriminator-value="CREDIT">
        <join table="CREDIT_PAYMENT">
            <key column="PAYMENT_ID"/>
            <property name="creditCardType" column="CCTYPE"/>
            ...
        </join>
    </subclass>
    <subclass name="CashPayment" discriminator-value="CASH">
        <join table="CASH_PAYMENT">
            <key column="PAYMENT_ID"/>
            ...
        </join>
    </subclass>
    <subclass name="ChequePayment" discriminator-value="CHEQUE">
        <join table="CHEQUE_PAYMENT" fetch="select">
            <key column="PAYMENT_ID"/>
            ...
        </join>
    </subclass>
</class>
另一答案

没有什么可以阻止你这样做。创建4个指向同一个表但不同Pojos的HBM。虽然可以做到,如@Ioan Alexandru Cucu,但不推荐。

   <!-- HBM1-->

<class name="com.myProject.Rack"
    table="My_Table">

   <!-- HBM2-->

   <class name="com.myProject.Rack"
    table="My_Table">

以上是关于Hibernate使用hbm.xml将多个类映射到一个表的主要内容,如果未能解决你的问题,请参考以下文章

hibernate笔记--实体类映射文件"*.hbm.xml"详解

Hibernate —— Entity.hbm.xml

使用oracle数据库和MySQL数据库时hibernate的映射文件.hbm.xml的不同

Hibernate映射文件详解(News***.hbm.xml)一

持久化类的应用:把持久化类映射到表

hibernate中使用annotation映射的时候,如何指定实体类中的某些字段不映射到数据库?