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

本文介绍了使用Hibernate实现树状自关联的数据模型配置方法,包括单向多对一和单向一对多的配置,并讨论了双向关联可能导致的内存溢出问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

问题:

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)就解决了内存溢出的问题。

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值