hibernate 树状自关联 *.hbm.xml 配置

来源:互联网 发布:域名如何别名解析 编辑:程序博客网 时间:2024/06/05 05:50

一直没有做过树状自关联的需求,以为很简单,但是,实际做的时候,有点懵了,他有他的特殊的地方。跟其他的不一样。

问题:

1.自身跟自身关联怎么配置

2.数据查询,怎么查出来是想要的。

3.暂且忘了这个问题了。不过,还是应该有这个疑惑。

没想明白,上网去看看他们都是怎么配置的。但是,基本上都是注解配置。而我用的是xml。看他们的不怎么理解其他的意思。总算弄清楚了,自己配置出现了内存溢出的问题。特别的来记一下。

网上的都是有特定需求很严谨的控制的,我在这里只是做一个测试。

这个里边的两个level与leaf其实是无关紧要的。


自关联,其实是树状数据,有父节点,有子节点,有根节点。所有,想想该怎么设置属性,毕竟数据库表就是这个样子了。

单项多对一的配置

public class Node {
 
private int id;
private String name;//节点名称
private int level;//层次,为了输出设计
//private boolean leaf;//是否为叶子节点,这是为了效率设计,可以可无
//父节点,因为多个节点属于一个父节点,因此用hibernate映射关系是多对一
private Node parent;

//其他的省略

}

<hibernate-mapping>
    <class name="com.test.relation.entity.Node" table="node" catalog="test">
        <id name="id" type="integer">
            <column name="node_id" />
            <generator class="native" />
        </id>
        <property name="name" type="string"></property>
        <many-to-one name="parent" column="pid"></many-to-one>
    </class>
</hibernate-mapping>


但是,结果是:

Node [id=1, level=0, name=1, parent=null]
Node [id=2, level=0, name=2, parent=null]
Node [id=3, level=0, name=3, parent=null]
Node [id=4, level=0, name=4, parent=Node [id=1, level=0, name=1, parent=null]]

单项一对多的配置

private int id;
private String name;//节点名称
private int level;//层次,为了输出设计
//private boolean leaf;//是否为叶子节点,这是为了效率设计,可以可无
//父节点,因为多个节点属于一个父节点,因此用hibernate映射关系是多对一
private Node parent;
//子节点,因为一个节点可以有多个子节点,因此用hibernate映射关系说是一对多
private Set<Node> children;

<hibernate-mapping>
    <class name="com.test.relation.entity.Node" table="node" catalog="test">
        <id name="id" type="integer">
            <column name="node_id" />
            <generator class="native" />
        </id>
        <property name="name" type="string"></property>

       
        <set name="children" lazy="false" inverse="true">
        <key column="pid"></key>
        <one-to-many class="com.test.relation.entity.Node"/>
        </set>
    </class>
</hibernate-mapping>

但是,结果是:

Node [children=[Node [children=[], id=4, level=0, name=4, parent=null]], id=1, level=0, name=1, parent=null]
Node [children=[], id=2, level=0, name=2, parent=null]
Node [children=[], id=3, level=0, name=3, parent=null]
Node [children=[], id=4, level=0, name=4, parent=null]

还是四条数据,但是,现在还是查询为四条数据。是不是添加其他的条件再进行查询。不管了,先进行测试吧。

如果做双向关联关系的话,两个都配置就可以了。在这里说一下,配置了双向的问题,那么,可能会出现无限循环对象属性,然后内存溢出的问题。这个问题你不输出就没事儿,用转json的话,我用的是fastjson ,在你不喜欢的字段上添加注解 @JSONField(serialize=false)就解决了内存溢出的问题。

那么,现在应该是可以做了

不符合实际情况,但是,总得记录一下,现在接下来,测试其他链接。


原创粉丝点击