Hibernate中的自引用实体

Hibernate中的自引用实体,hibernate,mapping,self-reference,Hibernate,Mapping,Self Reference,我有一个Action实体,它可以将其他Action对象作为双向一对多关系中的子对象。 问题是Hibernate输出以下异常: “集合:DbAction.childs列:actionId的映射中重复列” 下面是映射的代码: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourcefo

我有一个
Action
实体,它可以将其他
Action
对象作为双向一对多关系中的子对象。 问题是Hibernate输出以下异常:

“集合:DbAction.childs列:actionId的映射中重复列”

下面是映射的代码:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="DbAction" table="actions">

  <id name="actionId" type="short" />
  <property not-null="true" name="value" type="string" />

  <set name="childs" table="action_action" cascade="all-delete-orphan">
   <key column="actionId" />
   <many-to-many column="actionId" unique="true" class="DbAction" />
  </set>

  <join table="action_action" inverse="true" optional="false">
   <key column="actionId" />
   <many-to-one name="parentAction" column="actionId" not-null="true" class="DbAction" />
  </join>
 </class>
</hibernate-mapping>

这是因为您为同一个表多次声明了
name=“actionId”

正如armandino所建议的,我尝试将列名替换为“parentActionId”,它可以工作:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="DbAction" table="actions">

  <id name="actionId" type="short" />
  <property not-null="true" name="value" type="string" />

  <set name="childs" table="action_action" cascade="all-delete-orphan">
   <key column="parentActionId" />
   <many-to-many column="actionId" unique="true" class="DbAction" />
  </set>

  <join table="action_action" inverse="true" optional="false">
   <key column="actionId" />
   <many-to-one name="parentAction" column="parentActionId" not-null="true" class="DbAction" />
  </join>
 </class>
</hibernate-mapping>


因为我引用的是同一个实体,所以ID字段没有改变。对不起,你是对的。我认为在实体之间创建关系时必须指定相同的列名,但事实并非如此。因此,我通过将“set”元素的“key”元素中的“actionId”值替换为“parentActionId”,然后在“多对一”元素的“column”属性中设置“parentActionId”,解决了这个问题。