我有一个基本的树结构,由一个简单的Node
类组成,双向链接到它的单亲(根节点可以为空)和一个有序的子列表:
public class Node {
private Integer xid;
private Node parent;
private List<Node> children;
// getters and setters...
}
我使用休眠将其映射到以下简单的数据库表:
> select * from node;
xid | parent | xorder
-----+--------+--------
1 | NULL | 0
2 | 1 | 0
3 | 1 | 1
4 | 1 | 2
(4 rows)
使用以下.hbm
休眠映射文件:
<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);
}
当休眠刷新事务时出现异常:(org.hibernate.exception.ConstraintViolationException ... set parent=null, xorder=null where parent='1' and xid='2'
):基本上更新尝试设置xorder
为null
,这显然是数据库模式禁止的。
我在 hbm 映射上尝试了许多组合,但没有成功。当我设置<list>
为休眠时inverse="true"
不做任何更新,设置元素也无济于事。insert="false" update="false"
<many-to-one>
我可能在这里错过了一些东西,无论是在hbm
映射中还是在我的代码中,我的感觉是它应该很明显......知道吗?