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”,解决了这个问题。