Получение ошибки гибернации в сопоставлении XML: повторяющийся столбец в сопоставлении для объекта?

Я знаю, что в списке есть несколько похожих вопросов, но мне не удалось превратить их в решение моей конкретной проблемы.

Я использую файлы сопоставления 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>

person Thom DeCarlo    schedule 02.05.2012    source источник
comment
это может помочь вам понять ошибки insert = false update = false.   -  person ManuPK    schedule 02.05.2012
comment
Это то, что вы ищете: stackoverflow.com/questions/5338825/?   -  person Randy Stegbauer    schedule 02.05.2012
comment
Я все еще в замешательстве. У меня есть один-ко-многим, а не много-к-одному, и когда я добавил атрибуты i = f u = f, я получил еще одну ошибку, в которой говорилось, что что-то вроде вставки требуется в отношениях один-ко-многим   -  person Thom DeCarlo    schedule 02.05.2012
comment
Извини, Рэнди, что я такой новичок, но не понимаю, как это мне помогает.   -  person Thom DeCarlo    schedule 02.05.2012
comment
ManuPK, я ошибся по поводу ошибки. Когда я добавил атрибуты i = f u = f к моему «один ко многим», Eclipse показывает ошибку: необходимо объявить обновление атрибута для типа элемента «один ко многим». То же самое и с атрибутом вставки.   -  person Thom DeCarlo    schedule 03.05.2012


Ответы (1)


поскольку вложение поддерживает внешний ключ, вы должны установить инверсию на стороне один-ко-многим, чтобы сообщить H, что вложение будет поддерживать его

<list name="idAltBase1" cascade="all" inverse="true">

Также, если вы хотите видеть внешний ключ во вложении, почему бы не сопоставить его как ссылки.

  <many-to-one name="base1" column="idBase1"/>
  <many-to-one name="base2" column="idBase2"/>
  <many-to-one name="altBase1" column="idAltBase1"/>

Примечание. GetBase1 (). GetId () не будет выдавать выбор для строки Base1.

person Firo    schedule 03.05.2012
comment
Что ж, комбинация добавления атрибутов вставки и обновления к классу присоединения и обратного атрибута к базовым классам и классам altBase, похоже, сработала. Конечно, это позволило спящему режиму выдать мне еще больше ошибок, но это тема другой темы. Спасибо! - person Thom DeCarlo; 04.05.2012