Сопоставление коллекции Hibernate: свойство map‹String, Entity2› в Entity1

Я пытаюсь сопоставить следующие объекты с (устаревшими) таблицами БД, и у меня возникают проблемы с сопоставлением карты:

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>

Однако параметры загружаются не так, как нужно, в том числе, если я включаю нетерпеливую выборку, а также если я пытаюсь получить конфигурации с помощью именованного запроса и объединить выборку параметров конфигурации.

Почему это так? И как правильно отобразить ассоциацию?

У меня уже были некоторые идеи, в чем может быть проблема, похоже, это не проблема (по крайней мере, одна):

  1. у обоих объектов есть свойство с именем code , вероятно, неправильный используется Hibernate как map-key? (Конечно, он должен использовать свойство code сущности ConfigurationParam.)

  2. ConfigurationParam.code не уникален. Как видите, первичный ключ ConfigurationParam является составным. Однако, поскольку это карта, поддерживаемая конфигурацией, первичный ключ которой является второй частью этого композита, я думаю, что это должно быть в порядке. В любом случае Hibernate не жаловался.

  3. ConfigurationParam.code уже сопоставлен как свойство в самой сущности. Возможно, тогда вы больше не сможете использовать его как ключ карты? Впрочем, и этот Hibernate мне подскажет, наверное?

Я пытался найти ответы в документации Hibernate (вы же знаете кошек и тому подобное) и прочитал много других вопросов здесь, но не нашел ответа на этот конкретный вопрос.


person rainer198    schedule 08.11.2011    source источник


Ответы (1)


Ладно, наконец-то заработало. Отображение объекта-владельца карты должно быть таким:

<map name="configurationParams">
    <key column="CONFIGURATIONID" />
    <map-key type="string" column="CODE"/>
    <one-to-many class="ConfigurationParam" />
</map>

Похоже, что тег element используется для сопоставления основных типов (например, для карты). Если вы хотите, чтобы отображаемые сущности отображались как значения сопоставления, вам нужен тег «один ко многим».

В документации по спящему режиму указано: «Для коллекций базового или встраиваемого типа используйте @ElementCollection» (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/ collections.html) .

Хотя это не объясняется подробно и не для сопоставлений xml, я прочитал это так, решив свою проблему.

person rainer198    schedule 09.11.2011