私は単純なクラスで構成された基本的なツリー構造を持っており、単一の親(ルート ノードの場合は null になる可能性があります)と子の順序付きリストに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
休止状態マッピング ファイルを使用します。
<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>
ただし、次のコードを使用して、1 つの親内で要素の順序をシャッフルしようとすると:
@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
思いますが、それはかなり明白であるべきだと思います...何か考えはありますか?