Различители используются для хранения иерархий классов в единственной таблице. Что Вы имеете существует единый класс с разными значениями.
Элемент требуется для полиморфной персистентности с помощью стратегии отображения table-per-class-hierarchy и объявляет столбец различителя таблицы. Столбец различителя содержит значения маркера, которые говорят слой персистентности что подкласса инстанцировать для конкретной строки.
Я не думаю, что Вы сможете использовать единственный класс AdminNote для каждого из тех различных значений. Различитель используется на уровне базы данных, чтобы помочь отличить один подкласс от другого - это не на самом деле часть объектной модели Java.
Необходимо будет определить несколько подклассов AdminNote, один для каждого значения различителя.
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>
Вместо этого Чтобы попытаться использовать возможности наследования для получения ссылки на правильный класс, вам следует вместо этого рассмотреть возможность использования
Обычно, если вы указываете значение дискриминатора как целое число в подклассе, вы получаете ошибку
Не удалось отформатировать значение дискриминатора '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>