在XML映射中获取休眠错误:实体映射中的重复列?

时间:2012-05-02 15:42:05

标签: hibernate hibernate-mapping

我知道列表中有几个类似的问题,但是我没有成功将它们变成我特定问题的解决方案。

我正在为我的hibernate3配置使用XML映射文件。我需要在基础对象和多个附件对象之间创建一组单向关系。 (附件可以连接到基础对象上的多个站点,每个附加点可以容纳许多附件。我需要单独跟踪附件列表。)但是,这样做我得到了“实体映射中的重复列”异常。 / p>

org.hibernate.MappingException: Repeated column in mapping for entity: ATTACHMENT column: attachmentID (should be mapped with insert="false" update="false")

令我困惑的部分是基础对象映射仅使用“attachmentID”作为列表索引,而不是选择键。

有谁能告诉我如何设置这些映射文件以避免异常?我在这个论坛上发现的其他类似问题都使用了注释,但我需要使用XML。

这是我的附件对象。它确定了3种不同的附着点。一个基础对象类型有两个可能的附着点,另一个只有一个。当它附加到其中一个基点时,它会在相应的对象ID中获取该基础对象的ID,其余的设置为-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>

1 个答案:

答案 0 :(得分: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行发出select。