двунаправленная ассоциация «многие ко многим», использующая карту вместо набора - PullRequest
1 голос
/ 30 июня 2011

У меня есть время с этим, и любые предложения будут с благодарностью.

У меня есть двунаправленное сопоставление связей «многие ко многим» между двумя объектами (FlashCard и Tag), которое в настоящее время успешно представлено как java.util.Set . Я бы хотел изменить тип коллекции на java.util.Map .

Вот выдержка из рабочих отображений с использованием Set

<class name="FlashCard" table="FLASHCARD">

    <id name="flashCardId" type="int" column="FLASHCARD_ID">
        <meta attribute="scope-set">public</meta>
        <generator class="native" />
    </id>

    <property name="question" type="string">
        <meta attribute="use-in-tostring">true</meta>
        <column name="QUESTION" not-null="true" unique="true" />
    </property>

    <set name="tags" table="FLASHCARD_TAG">
        <meta attribute="field-description">Tags for this FlashCard</meta>
        <key column="FLASHCARD_ID" />
        <many-to-many class="Tag"
            column="TAG_ID" />
    </set>

</class>

<class name="Tag" table="TAG">

    <id name="tagId" type="int" column="TAG_ID">
        <meta attribute="scope-set">public</meta>
        <generator class="native" />
    </id>

    <property name="name" type="string">
        <meta attribute="use-in-tostring">true</meta>
        <column name="NAME" not-null="true" unique="true" />
    </property>

    <set name="flashcards" table="FLASHCARD_TAG" inverse="true">
        <meta attribute="field-description">FlashCards for this Tag</meta>
        <key column="TAG_ID" />
        <many-to-many class="FlashCard"
            column="FLASHCARD_ID" />
    </set>

</class>

Хорошо, как я уже говорил, это работает, но я бы хотел изменить коллекцию на тип java.util.Map.

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

<class name="FlashCard" table="FLASHCARD">

    <id name="flashCardId" type="int" column="FLASHCARD_ID">
        <meta attribute="scope-set">public</meta>
        <generator class="native" />
    </id>

    <property name="question" type="string">
        <meta attribute="use-in-tostring">true</meta>
        <column name="QUESTION" not-null="true" unique="true" />
    </property>

    <map name="tags" cascade="all" table="FLASHCARD_TAG">
        <meta attribute="field-description">Tags for this FlashCard</meta>
        <key column="FLASHCARD_ID" not-null="true" />
        <map-key type="String" column="NAME" formula="NAME"/>
        <many-to-many column="TAG_ID" class="Tag"/>
    </map>

</class>

<class name="Tag" table="TAG">

    <id name="tagId" type="int" column="TAG_ID">
        <meta attribute="scope-set">public</meta>
        <generator class="native" />
    </id>

    <property name="name" type="string">
        <meta attribute="use-in-tostring">true</meta>
        <column name="NAME" not-null="true" unique="true" />
    </property>

    <map name="flashcards" inverse="true" cascade="all" table="FLASHCARD_TAG">
        <meta attribute="field-description">FlashCards for this Tag</meta>
        <key column="TAG_ID" not-null="true" />
        <map-key type="String" column="QUESTION" formula="QUESTION" />
        <many-to-many column="FLASHCARD_ID" class="FlashCard"/>
    </map>

</class>

Когда я говорю, что эти отображения «частично работают», я имею в виду, что я смог использовать эти отображения для генерации таблиц базы данных и классов сущностей. Классы сущностей действительно включают коллекцию типа java.util.Map. Все это выглядело как находка и компилировалось без ошибок.

Однако, когда я запускаю код, я получаю ошибки времени выполнения из hibernate следующим образом: org.hibernate.MappingException: Не удалось определить тип для: String, в таблице: FLASHCARD_TAG, для столбцов: [org.hibernate.mapping.Formula (NAME)] в org.hibernate.mapping.SimpleValue.getType (SimpleValue.java:306)

В документации Hibernate приведен пример двунаправленной ассоциации "многие ко многим", но в ней используется набор. Вот ссылка на документы.

Резюме

  • Есть две сущности: FlashCard и Tag
  • Сущность FlashCard имеет коллекцию ссылок на другие сущности типа Tag
  • У сущности Tag есть коллекция ссылок на другие сущности типа FlashCard
  • Это двусторонняя ассоциация «многие ко многим»
  • FLASHCARD_TAG - таблица ассоциации
  • Ассоциация в настоящее время представлена ​​как java.util.Set, который, согласно документации Hibernate, является наиболее часто используемым отображением коллекции.
  • Я хочу использовать java.util.Map вместо java.util.Set

1 Ответ

0 голосов
/ 01 ноября 2017

Двунаправленная ассоциация не работает с использованием LIST & MAP.Работает нормально, используя только SET.Используя LIST, он будет генерировать неожиданные значения порядков индекса при сохранении с обеих сторон, и в итоге вы получите ошибку с MAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...