Будьте в спящем режиме отображения с различителем

Я думаю, тебе следует перезагрузить сервер.

8
задан Mike Pone 6 October 2008 в 16:16
поделиться

4 ответа

Различители используются для хранения иерархий классов в единственной таблице. Что Вы имеете существует единый класс с разными значениями.

http://docs.jboss.org/hibernate/core/3.5/reference/en-US/html/mapping.html#mapping-declaration-discriminator

Элемент требуется для полиморфной персистентности с помощью стратегии отображения table-per-class-hierarchy и объявляет столбец различителя таблицы. Столбец различителя содержит значения маркера, которые говорят слой персистентности что подкласса инстанцировать для конкретной строки.

Я не думаю, что Вы сможете использовать единственный класс AdminNote для каждого из тех различных значений. Различитель используется на уровне базы данных, чтобы помочь отличить один подкласс от другого - это не на самом деле часть объектной модели Java.

Необходимо будет определить несколько подклассов AdminNote, один для каждого значения различителя.

9
ответ дан 5 December 2019 в 17:43
поделиться

AFAIK, вы можете повторно использовать имена классов Java для сопоставлений подклассов, если вы используете имена сущностей.

Попробуйте сопоставление ниже. Здесь само отображение суперкласса является абстрактным. Подклассы используют один и тот же класс Java и имя объекта для каждого подкласса. Возможно, вам потребуется указать имя объекта в сопоставлении суперкласса. Однако я бы лично использовал отдельные подклассы Java для каждого сопоставления подклассов, так как с именами сущностей вам нужно будет указать имя сущности, когда вам нужно сохранить объект через API сеанса , или реализовать имена сущностей разрешение в Tuplizer ( Hibernate 3.3.2) на основе поля adminNoteType.

<hibernate-mapping package="com.tlr.finance.mappings">

    <class name="AdminNotes" table="admin_notes" abstract="true">
        <id name="adminNoteId" column="admin_note_id" type="integer">
          <generator class="identity" />
        </id>

        <discriminator column="note_type" type="string" />

        <!-- Make this property an enumerated type. It is the discriminator. -->
        <property name="adminNoteType" column="note_type" type="string" not-null="true" />
        <property name="adminNote" column="note" type="string" not-null="true" />
        <property name="adminNoteAdded" column="note_date" type="timestamp"
          not-null="true" />

        <subclass name="AdminNotes" discriminator-value="project" entity-name="project">
            <many-to-one name="noteObject" column="object_id" class="PsData" /><!-- Project -->
        </subclass>

        <subclass name="AdminNotes" discriminator-value="user" entity-name="user">
            <!-- rename timekeep to user -->
            <many-to-one name="noteObject" column="object_id" class="Timekeep" /><!-- user -->
        </subclass>

        <subclass name="AdminNotes" discriminator-value="costCenter" entity-name="costCenter">
            <!-- rename timekeep to user -->
            <many-to-one name="noteObject" column="object_id" class="CostCenter" /><!-- cost center -->
        </subclass>
    </class>
</hibernate-mapping>
0
ответ дан 5 December 2019 в 17:43
поделиться

Вместо этого Чтобы попытаться использовать возможности наследования для получения ссылки на правильный класс, вам следует вместо этого рассмотреть возможность использования

0
ответ дан 5 December 2019 в 17:43
поделиться

Целочисленный дискриминатор

Обычно, если вы указываете значение дискриминатора как целое число в подклассе, вы получаете ошибку

Не удалось отформатировать значение дискриминатора 'TYPE' в строку SQL с помощью (...)

Если вы хотите использовать дискриминатор как целочисленное значение, вам нужно прежде всего указать его для базового класса как целое число, установив атрибут дискриминатор-значение в элементе класса:

<class name="AdminNotes" table="admin_notes" abstract="true" discriminator-value= "-1">

Это заменяет поведение по умолчанию, когда дискриминатор является именем класса, когда значение не найдено.

<hibernate-mapping package="com.tlr.finance.mappings">

    <class name="AdminNotes" table="admin_notes" abstract="true" discriminator-value= "-1">
        <id name="adminNoteId" column="admin_note_id" type="integer">
            <generator class="identity" />
        </id>
        <discriminator column="note_type" type="integer" />

        <!-- Make this property an enumerated type. It is the discriminator. -->
        <property name="adminNoteType" column="note_type" type="string" not-null="true" />
        <property name="adminNote" column="note" type="string" not-null="true" />
        <property name="adminNoteAdded" column="note_date" type="timestamp"
                  not-null="true" />

        <subclass name="AdminNotes" discriminator-value="0" entity-name="project">
            <many-to-one name="noteObject" column="object_id" class="PsData" /><!-- Project -->
        </subclass>

        <subclass name="AdminNotes" discriminator-value="1" entity-name="user">
            <!-- Rename timekeep to user -->
            <many-to-one name="noteObject" column="object_id" class="Timekeep" /><!-- user -->
        </subclass>

        <subclass name="AdminNotes" discriminator-value="2" entity-name="costCenter">
            <!-- Rename timekeep to user -->
            <many-to-one name="noteObject" column="object_id" class="CostCenter" /><!-- cost center -->
        </subclass>
    </class>
</hibernate-mapping>
1
ответ дан 5 December 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: