我知道列表中有几个类似的问题,但是我没有成功将它们变成我特定问题的解决方案。
我正在为我的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>
答案 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。