Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate


Автор: PovAnd 19.9.2007, 15:49
Вот такая проблема. У меня есть класс, я с помощью мэпа отображаю его в таблицу БД, все классно. Но если мне нужно отобразить один и тот же класс на две таблицы. Может ли кто предложить вариант такого отображения?

Автор: AntonSaburov 19.9.2007, 16:04
Посмотри главу в доке - 9.1.4. Mixing table per class hierarchy with table per subclass

Т.е. можно создать класс, который будет мапится на одну таблицу, а потом создать потомка, который приджойнится на вторую.

Вот XML

Код

<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">
            <property name="creditCardType" column="CCTYPE"/>
            ...
        </join>
    </subclass>
    <subclass name="CashPayment" discriminator-value="CASH">
        ...
    </subclass>
    <subclass name="ChequePayment" discriminator-value="CHEQUE">
        ...
    </subclass>
</class>

Автор: Alexis 19.9.2007, 16:07
Цитата(PovAnd @  19.9.2007,  16:49 Найти цитируемый пост)
Но если мне нужно отобразить один и тот же класс на две таблицы.

Нужно просто в маппинге указать entity-name. И спокойно написать два маппинга на разные таблицы, класс будет один, а entity-name разные.

Автор: AntonSaburov 19.9.2007, 16:16
Цитата(Alexis @  19.9.2007,  16:07 Найти цитируемый пост)
Нужно просто в маппинге указать entity-name. 

А можно пример записи - а то что-то не укладывается в голове - самому стало интересно.

Автор: PovAnd 19.9.2007, 16:30
Дейчтвительно, есть еще аттрибут entity-name и он по умолчанию такой же как имя класса, его нужно просто выстовлять оригинальным и тогда все Ок!

Код

    <class name="ObjectEntity" table="ENTIY" entity-name="ObjectEntity">
        <id name="id" column="ID" type="long" unsaved-value="0">
            <generator class="native" />
        </id>

        <many-to-one name="type" column="TYPE_ID" class="Type" entity-name="Type"
            not-null="true" />
    </class>


Спасибо за помощь.

Автор: Alexis 19.9.2007, 16:33
Цитата(AntonSaburov @  19.9.2007,  17:16 Найти цитируемый пост)
А можно пример записи - а то что-то не укладывается в голове - самому стало интересно. 

Пока ответ набирал уже пример привели. Вот цитата из документации:

http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-declaration-class
entity-name (optional, defaults to the class name): Hibernate3 allows a class to be mapped multiple times (to different tables, potentially), and allows entity mappings that are represented by Maps or XML at the Java level. In these cases, you should provide an explicit arbitrary name for the entity. See Section 4.4, “Dynamic models” and Chapter 18, XML Mapping  for more information.


Автор: AntonSaburov 19.9.2007, 16:51
Цитата(Alexis @  19.9.2007,  16:33 Найти цитируемый пост)
Пока ответ набирал уже пример привели. Вот цитата из документации:

Ну и что дальше ? Я что-то пытаюсь сделать - и не могу. Может просто не увидеть - бывает smile

Автор: Alexis 19.9.2007, 17:04
Цитата(AntonSaburov @  19.9.2007,  17:51 Найти цитируемый пост)
Ну и что дальше ? Я что-то пытаюсь сделать - и не могу. Может просто не увидеть - бывает smile 

Извиняюсь, похоже, что вы меня неверно поняли. Я написал о том, что пока я набирал пример использования, PovAnd уже успел привести пример, да еще и проверить его работоспособность.

Автор: AntonSaburov 19.9.2007, 17:10
Цитата(Alexis @  19.9.2007,  17:04 Найти цитируемый пост)
PovAnd уже успел привести пример, да еще и проверить его работоспособность. 

Да я понимаю - я просто не вижу вывода - ну есть у меня две таблицы Table1 и Table2 с полями ID, Name1 и ID, Name2

Ну и как мне описать класс TableClass в xml ? Поля соответсвенно ID, Name1, Name2

Код

    <class name="TableClass" table="Table1" entity-name="TableEntity">
        <id name="id" column="ID" type="long" unsaved-value="0">
            <generator class="native" />
        </id>
        <property name="Name1" column="Name1"/>

// И что тут дальше писать ?

    </class>

Автор: Alexis 19.9.2007, 17:15
Цитата(AntonSaburov @  19.9.2007,  18:10 Найти цитируемый пост)
// И что тут дальше писать ?

Здесь ничего писать не надо. Нужно отдельно добавить еще один класс, только с другим entity-name, например:
Код

<class name="TableClass" table="Table2" entity-name="AnotherTableEntity">
        <id name="id" column="ID" type="long" unsaved-value="0">
            <generator class="native" />
        </id>
        <property name="Name1" column="Name1"/>
</class>

Можно вообще entity-name не указывать, поскольку по-умолчанию это имя берется как имя класса.

Только вот ссылку нашел интересную:
http://www.nabble.com/Mapping-class-to-multiple-tables-with-entity-name-(hibernate-plugin)-t3425474.html
оказывается, это с аннотациями не работает.

Автор: AntonSaburov 19.9.2007, 17:30
А-а-а-а-а. Въехал. Спасибо большое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)