“实体映射中的重复列”,其中每列仅映射一次

时间:2013-10-28 10:41:38

标签: java sql-server hibernate hibernate-mapping

我有一个hibernate映射文件ParcelServicePresetIds.hbm.xml:

<hibernate-mapping>
<class name="de.delife.sql.ParcelServicePresetIds" table="ParcelServicePresetIDs" schema="dbo" catalog="xxx">
    <id name="id" type="int">
        <column name="ID" />
        <generator class="assigned" />
    </id>
    <many-to-one name="itemsBase" class="de.sql.ItemsBase" fetch="select" property-ref="itemId">
        <column name="ItemID" />
    </many-to-one>
    <property name="itemId" column="ItemID" type="java.lang.Integer"/>
    <property name="intValue" type="java.lang.Integer">
        <column name="intValue" />
    </property>
</class>
</hibernate-mapping>

当我运行程序时出现错误:

Initial SessionFactory creation failed.org.hibernate.MappingException: Repeated column in mapping for entity: de.sql.ParcelServicePresetIds column: ItemID (should be mapped with insert="false" update="false")

为什么?

我有另一个实体Others.hbm.xml:

<many-to-one name="itemsBase" class="de.sql.ItemsBase" fetch="select" property-ref="itemId">
    <column name="ItemID" unique="true" />
</many-to-one>
<property name="itemId" column="ItemID" type="java.lang.Integer"/>

在这个实体中,它正在工作!我不明白! 有人可以解释这个区别吗?

2 个答案:

答案 0 :(得分:0)

您要两次声明ItemID列:一次使用<property />,第二次使用<many-to-one />代码。
删除一个(可能是<property/>声明)

答案 1 :(得分:0)

您可能不需要在这里使用propertyRef。它可能只是:

<many-to-one name="itemsBase" class="de.sql.ItemsBase" fetch="select" column="ItemID"/>

此外,您不需要itemId的属性声明。

回答问题的第二部分:

  • 每当您提供propertyRef时,您需要使用属性定义进行跟进。
  • 如果是'托管列',例如外键引用;您应该使用insert="false" update="false"
  • 限定属性定义
  • 但是,在大多数情况下;你不需要一个propertyRef。您可以在多对一部分中使用简单的列定义。