gpt4 book ai didi

java - Hibernate:在双向有序树中打乱子节点

转载 作者:行者123 更新时间:2023-12-01 05:04:45 27 4
gpt4 key购买 nike

我有一个基本的树结构,由简单的Node组成。类,双向链接到它的单父(根节点可以为空)和有序的子列表:

public class Node {
private Integer xid;
private Node parent;
private List<Node> children;
// getters and setters...
}

我使用 hibernate 将其映射到以下简单的数据库表:

 > select * from node;
xid | parent | xorder
-----+--------+--------
1 | NULL | 0
2 | 1 | 0
3 | 1 | 1
4 | 1 | 2
(4 rows)

使用以下.hbm hibernate 映射文件:

<class name="Node" table="node">
<id name="xid" type="int">
<generator class="native" />
</id>
<many-to-one name="parent" />
<list name="children" table="node">
<key column="parent" />
<list-index column="xorder" />
<one-to-many class="Node" />
</list>
</class>

但是,当我尝试使用以下代码在一个父级中打乱元素顺序时:

@Transactional
public void testNode() {
Node parent = (Node) getSession().get(Node.class, 1);
Node child0 = parent.getChildren().remove(0);
parent.getChildren().add(1, child0); // Swap first and second child
getSession().update(parent);
}

当 hibernate 刷新事务时出现异常:( org.hibernate.exception.ConstraintViolationException ... set parent=null, xorder=null where parent='1' and xid='2' ):基本上更新尝试设置 xordernull ,这显然是数据库模式所禁止的。

我在 hbm 映射上尝试了很多组合,但没有成功。当我设置 <list>inverse="true" hibernate不做任何更新,设置insert="false" update="false"关于<many-to-one>元素也没有帮助。

我可能在这里错过了一些东西,要么在hbm中映射或在我的代码中,我的感觉是它应该非常明显......有什么想法吗?

最佳答案

[更新]

之前的答案不正确。我认为违反约束是因为父级被设置为空,并且排序可以避免这种情况。由于问题出在 xorder 字段上,我认为在更新之前,您需要手动遍历列表并确保对于列表中的每个项目,每个节点的 xorder 字段与该项目在列表中的顺序匹配列表。

例如,当您拉取测试列表时,您可能有3个节点。对于列表中的项目 0 xorder=0,项目 1 具有 xorder=1,项目 2 具有 xorder=2。如果您对列表中的这些节点重新排序(例如交换 0 和 1),您应该确保将新的 item 0 xorder 值从 1 更改为 0,并且现在为 item 1 的节点的 xorder 应该为 1。

要么创建一个新的新子列表,其中的节点按正确的顺序排列,并将 Children 属性设置为新列表。

[上一页]

做类似的事情怎么样

Collections.sort(parent.getChildren(), new MyComparator());

现在您所要做的就是编写一个 Comparator 实现来进行您想要的排序更改。我认为这可以避免在删除时将父级设置为 null 的约束冲突。

关于java - Hibernate:在双向有序树中打乱子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com