У меня есть время с этим, и любые предложения будут с благодарностью.
У меня есть двунаправленное сопоставление связей «многие ко многим» между двумя объектами (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