Hibernate отображает несколько классов в одну таблицу с помощью hbm.xml - PullRequest
4 голосов
/ 05 января 2012

Я довольно новичок в Hibernate и мне нужна помощь с отображением hibernate.

У меня есть 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" выше должны формировать составные первичные ключи.

Может кто-нибудь показать мне пример того, как я должен отобразить это? Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 марта 2013

Hibernate предоставляет способ отображения подкласса с помощью ключевого слова дискриминатора.

<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>
0 голосов
/ 05 января 2012

Ничто не мешает вам сделать это.Создайте 4 HBM, указывающих на одну и ту же таблицу, но разные Pojos.Хотя это может быть сделано, как @Ioan Alexandru Cucu, это не рекомендуется.

   <!-- HBM1-->

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

   <!-- HBM2-->

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