Я пытаюсь сопоставить следующие объекты с (устаревшими) таблицами БД, и у меня возникают проблемы с сопоставлением карты:
public class Configuration {
private Long configurationId;
private String code;
private Long index;
private Map<String, ConfigurationParam> configurationParams;
...
}
и
public class ConfigurationParam {
private Long configurationId; // foreign key
private String code;
private String value;
...
}
Как видите, объект configuration содержит карту объектов configurationParam. Ключом карты является свойство кода ConfigurationParam . Обратите внимание, что свойства code каждой сущности не связаны друг с другом (устаревшая схема :( )
Отображение гибернации выглядит так:
<class name="Configuration" table="CONFIGURATION" dynamic-update="true">
<id name="configurationId" column="CONFIGURATIONID">
<generator class="assigned" />
</id>
<property name="configurationSetId" column="CONFIGURATIONSETID" />
<property name="code" column="CODE" />
<property name="index" column="INDX" />
<map name="configurationParams" lazy="true" table="CONFIGURATIONPARAM" fetch="select"
batch-sie="10">
<key column="CONFIGURATIONID" />
<map-key type="string" column="CODE"/>
<element type="ConfigurationParam"></element>
</map>
</class>
и
<class name="ConfigurationParam" table="CONFIGURATIONPARAM" dynamic-update="true">
<composite-id class="ConfigurationParamId" mapped="true">
<key-property name="configurationId"/>
<key-property name="code"/>
</composite-id>
<property name="configurationId" column="CONFIGURATIONID" />
<property name="code" column="CODE" />
<property name="value" column="VALUE" />
</class>
Однако параметры загружаются не так, как нужно, в том числе, если я включаю нетерпеливую выборку, а также если я пытаюсь получить конфигурации с помощью именованного запроса и объединить выборку параметров конфигурации.
Почему это так? И как правильно отобразить ассоциацию?
У меня уже были некоторые идеи, в чем может быть проблема, похоже, это не проблема (по крайней мере, одна):
у обоих объектов есть свойство с именем code , вероятно, неправильный используется Hibernate как map-key? (Конечно, он должен использовать свойство code сущности ConfigurationParam.)
ConfigurationParam.code не уникален. Как видите, первичный ключ ConfigurationParam является составным. Однако, поскольку это карта, поддерживаемая конфигурацией, первичный ключ которой является второй частью этого композита, я думаю, что это должно быть в порядке. В любом случае Hibernate не жаловался.
ConfigurationParam.code уже сопоставлен как свойство в самой сущности. Возможно, тогда вы больше не сможете использовать его как ключ карты? Впрочем, и этот Hibernate мне подскажет, наверное?
Я пытался найти ответы в документации Hibernate (вы же знаете кошек и тому подобное) и прочитал много других вопросов здесь, но не нашел ответа на этот конкретный вопрос.