hibernate树状结构映射

本文介绍了如何在Hibernate中映射树状结构,例如公司的子公司和部门组织架构。利用id和parent_id字段构建树形关系,通过代码展示了具体的层次结构。

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

什么是hibernate树状结构?
一个公司可能有很多个子公司,子公司下面可能还有孙子公司,子公司里面还有很多部门,
这就组成一棵树。在数据库表中,使用的是id和pid(parent_id)。通过id和pid就存放一颗树了。
代码如下:

@Entity
@Table(name="T_COMPANY")
public class Company {
 private int id;
 private String name;
 //"一对多"
 private Set<Company>children=new HashSet<Company>();
 //"多对一"
 private Company parent;
 @Id
 @GeneratedValue
public int getId() {
    return id;
}
@OneToMany (mappedBy="parent",
        cascade={CascadeType.ALL},
        fetch=FetchType.EAGER
        )
public void setChildren(Set<Company> children) {
    this.children = children;
}
@ManyToOne(
        cascade={CascadeType.ALL}       
)
@JoinColumn(name="parent_id")
public Company getParent() {
    return parent;
}
//省略无关set/get...
}

@Test
    public void save(){
        Company c = new Company();
        c.setName("总");
        Company c1 = new Company();
        c1.setName("分1");
        Company c2 = new Company();
        c2.setName("分2");
        Company c11 = new Company();
        c11.setName("分1——部门1");
        Company c12 = new Company();
        c12.setName("分1——部门2");
        c.getChildren().add(c2);
        c.getChildren().add(c1);

        c1.getChildren().add(c11);
        c1.getChildren().add(c12);


        c11.setParent(c1);
        c12.setParent(c1);
        c1.setParent(c);
        c2.setParent(c);

    Configuration config=new AnnotationConfiguration();
    SessionFactory factory=config.configure().buildSessionFactory();
    Session session=factory.getCurrentSession();
    session.beginTransaction();
    session.save(c);
    session.getTransaction().commit();
    factory.close();
    }
    @Test
    public void load(){
        save();

        Configuration config=new AnnotationConfiguration();
        SessionFactory factory=config.configure().buildSessionFactory();
        Session session=factory.getCurrentSession();
        session.beginTransaction();
        Company co=(Company)session.load(Company.class, 1);
        print(co,0);//把co打印出来。建print方法
        session.getTransaction().commit();
        factory.close();    
    }
    //print(co,0);这个方法递归调用打印出这棵树。
    private void print(Company co , int level) {
        String str="";
        for(int i=0;i<level;i++){
            str+="****";

        }
        System.out.println(str+co.getName());
        for(Company child : co.getChildren()) {
            print(child,level+1);
        }
    }


**分2
**分1
**分1——部门1
**分1——部门2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值