0

我有一个休眠映射文件 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"/>

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

4

2 回答 2

0

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

于 2013-10-28T10:45:44.367 回答
0

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

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

此外,您不需要为itemId.

要回答问题的第二部分:

  • 每当您提供 propertyRef 时,您都需要使用属性定义来跟进它。
  • 如果它是“托管列”,例如外键引用;你应该用 insert="false" update="false"
  • 但是,在大多数情况下;您不需要 propertyRef。您可以在多对一部分中使用简单的列定义。
于 2013-10-28T10:47:00.133 回答