Я использую динамическую карту Hibernate для загрузки объектов DataEntry в мое приложение. Когда я загружаю любой данный объект DataEntry, я хочу получить описательное значение его столбца InformationTypeId. InformationTypeId таблицы DataEntry на самом деле представляет собой код в таблице InformationType. Я хочу, чтобы Hibernate делал в файле отображения, чтобы найти строку InformationType для объекта DataEntry и вернуть значение его столбца InformationDesc.
Вот таблицы и столбцы:
create table DataEntry (DataEntryID, InformationTypeId)
create table InformationType (InformationTypeId, InformationTypeDesc)
Следующий файл hbm.xml делает то, что я хотел бы загрузить. В свойстве informationType я указал столбец, используя атрибут read. Это вызывает этот конкретный запрос SQL.
<class entity-name="DataEntry" table="DataEntry">
<id name="dataEntryId" type="string">
<column name="DataEntryID" length="36" />
<generator class="assigned" />
</id>
<property name="informationType" type="string">
<column name="InformationTypeId"
read="(SELECT TOP 1 InformationType.InformationDesc FROM InformationType WHERE InformationType.InformationTypeId = InformationTypeId)"/>
</property>
</class>
Подход выше работает для загрузки. Хотя есть две проблемы:
- Обновления не работают
- Требуется ручной SQL (MS SQL Server).
Есть ли способ настроить это поведение без оператора SQL?
Это похоже на что-то, что было бы довольно распространенным, но я не видел никаких примеров этого. Я попробовал следующее с помощью соединения, но оно не работает. Я считаю, что это объединение не работает, потому что оно пытается соединиться с использованием закрытого ключа DataEntry. Мне нужно, чтобы он присоединился, используя DataEntry's InformationTypeId.
<join table="informationType" optional="true" fetch="select">
<key column="InformationTypeId"/>
<property name="informationType" type="string">
<column name="InformationDesc"/>
</property>
</join>