【问题标题】:Getting a hibernate error in XML mapping: Repeated column in mapping for entity?在 XML 映射中出现休眠错误:实体映射中的重复列?
【发布时间】:2012-05-02 15:42:04
【问题描述】:

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

我正在为我的 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>

【问题讨论】:

  • this 可能会帮助您了解 insert="false" update="false" 错误。
  • 这是您要查找的内容:stackoverflow.com/questions/5338825/…?
  • 我还是一头雾水。我有一对多,而不是多对一,当我添加 i=f u=f 属性时,我收到另一个错误,上面写着“在一对多关系中需要插入”跨度>
  • 对不起,兰迪,我是个新手,但我不明白这对我有什么帮助。
  • ManuPK,我误会了这个错误。当我将 i=f u=f 属性添加到我的一对多时,Eclipse 显示错误:“必须为元素类型“一对多”声明属性“更新”。 “插入”属性也是如此。

标签: hibernate hibernate-mapping


【解决方案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 行发出选择。

【讨论】:

  • 好吧,将插入和更新属性添加到附件类以及将反向属性添加到基类和 altBase 类的组合似乎奏效了。当然,这让 hibernate 向我吐出更多错误,但这是另一个线程的主题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2016-11-20
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多