Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate自参考映射难题_Java_Hibernate_Mapping_Bidirectional - Fatal编程技术网

Java Hibernate自参考映射难题

Java Hibernate自参考映射难题,java,hibernate,mapping,bidirectional,Java,Hibernate,Mapping,Bidirectional,我正在尝试绘制一个类 Class Node { Node parent; List<Node> children; } 类节点{ 节点父节点; 列出儿童名单; } 我尝试过多对一和一对多的各种组合,但似乎没有任何效果。我本想粘贴我的映射文件,但我尝试了太多的东西,我不知道该粘贴哪一个。请帮助我:(如果我使用SET而不是LIST,我也成功地映射了类,但是当我使用LIST时,我无法更新用于存储列表索引的列。非常感谢。您不能直接更新列表索引,因为它是通过检查对象在父对象的子列表中的位置

我正在尝试绘制一个类

Class Node {
Node parent;
List<Node> children;
}
类节点{
节点父节点;
列出儿童名单;
}

我尝试过多对一和一对多的各种组合,但似乎没有任何效果。我本想粘贴我的映射文件,但我尝试了太多的东西,我不知道该粘贴哪一个。请帮助我:(如果我使用SET而不是LIST,我也成功地映射了类,但是当我使用LIST时,我无法更新用于存储列表索引的列。非常感谢。

您不能直接更新列表索引,因为它是通过检查对象在父对象的子列表中的位置派生的。如果在列表中的索引10处,并且
列表索引
属性设置为5,Hibernate应该使用哪个

因此,通常您会告诉Hibernate使用哪个列来存储列表索引,然后忘记它

但是,如果要将
列表索引
属性映射到对象,以便直接访问它(以只读方式,例如
getIndexInList()
),则必须使用
insert=false update=false
对其进行映射

我对XML映射有点生疏,但这里有一些我认为会起作用的东西。如果您有问题,请告诉我您收到了什么错误消息

<hibernate-mapping>
 <class name="com.example.Node" table="node">
    <id name="id" column="nodeId">
        <generator class="native"/>
    </id>

    <property
        name="listIndex"
        column="listIndex"
        insert="false"
        update="false" />

    <many-to-one
        name="parent"
        column="parentNodeId"
        class="com.example.Node"/>

    <list name="children" inverse="true" cascade="all">
        <key column="parentNodeId"/>
        <list-index column="listIndex"/>
        <one-to-many class="com.example.Node"/>
    </list>

 </class>
</hibernate-mapping>

感谢SeanA的回复,不幸的是它仍然不起作用。当我说我不能更新列表索引时,我并不是说我想自己更新列表索引,而是hibernate没有更新列表索引。在数据库中,“listIndex”的整列都显示了默认值!!!SeanA,我想当inverse=“true”时对于list,hibernate会跳过它,并且不会更新列表索引列。我认为这是hibernate.javaman中的一个错误,请尝试将cascade=“all”添加到元素中。另外,尝试在元素中添加一个。请参见更新的XML。类似于“parentNodeId”可能会抱怨被映射了两次,因此如果被映射,请尝试将其从多映射到一。如果有效,请告诉我!