1

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

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

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>
4

1 回答 1

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 行发出选择。

于 2012-05-03T05:56:50.390 回答