Отображение коллекции Hibernate: свойство map <String, Entity2> в Entity1 - PullRequest
1 голос
/ 08 ноября 2011

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

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 .Обратите внимание, что свойства код каждого объекта не связаны друг с другом (устаревшая схема :()

Отображение гибернации выглядит следующим образом:

<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>

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 09 ноября 2011

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

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

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

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

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

...