Я знаю, что в списке есть несколько похожих вопросов, но мне не удалось превратить их в решение моей конкретной проблемы.
Я использую файлы сопоставления XML для своей конфигурации hibernate3. Мне нужно создать группу однонаправленных отношений между базовым объектом и несколькими объектами вложений. (Вложения могут подключаться к нескольким сайтам на базовом объекте, и каждая точка подключения может содержать множество вложений. Мне нужно отслеживать списки вложений отдельно.) Но при этом я получаю исключение «Повторяющийся столбец в сопоставлении для объекта».
org.hibernate.MappingException: Repeated column in mapping for entity: ATTACHMENT column: attachmentID (should be mapped with insert="false" update="false")
Что меня сбивает с толку, так это то, что при сопоставлении базового объекта в качестве индекса списка используется только «attachmentID», а не ключ выбора.
Может ли кто-нибудь сказать мне, как настроить эти файлы сопоставления, чтобы избежать исключения? Все другие похожие вопросы, ответы на которые я нашел на этом форуме, используют аннотации, но мне нужно использовать XML.
Это объект моей привязанности. Он определяет 3 различных типа точек крепления. Один базовый тип объекта имеет две возможные точки крепления, а другой - только одну. Когда он присоединяется к одной из базовых точек, он получает идентификатор этого базового объекта в соответствующем идентификаторе объекта, а остальные устанавливаются в -1 (что является специальной базовой записью).
(Конечно, эти сопоставления радикально урезаны, но я думаю, что захватил все функции импорта.)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="attachment" table="ATTACHMENT">
<id column="attachmentID" name="attachmentID" type="int">
<generator class="identity"></generator>
</id>
<property name="idBase1"></property>
<property name="idBase2"></property>
<property name="idAltBase1"></property>
</class>
</hibernate-mapping>
Это файл сопоставления для базового объекта.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="base" table="BASE">
<id column="IDBASE" name="idBase" type="int">
<generator class="identity"></generator>
</id>
<property name="type"></property>
<list name="attachment1" cascade="all">
<key column="idBase1" not-null="true" />
<list-index column="attachmentID" base="0" />
<one-to-many class="ATTACHMENT"/>
</list>
<list name="attachment2" cascade="all">
<key column="idBase2" not-null="true"/>
<list-index column="attachmentID" base="0" />
<one-to-many class="ATTACHMENT"/>
</list>
</class>
</hibernate-mapping>
и это файл сопоставления для альтернативного базового объекта. Он выглядит так же, как основной базовый объект, но имеет только один список вложений. И я думаю, что это нормально. Или, по крайней мере, это сопоставление не создает исключения.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="altBase" table="BASE">
<id column="IDBASE" name="idBase" type="int">
<generator class="identity"></generator>
</id>
<property name="type"></property>
<list name="idAltBase1" cascade="all">
<key column="idBase1" not-null="true" />
<list-index column="attachmentID" base="0" />
<one-to-many class="ATTACHMENT"/>
</list>
</class>
</hibernate-mapping>