hibernate树状映射

例如公司的组织机构:一个公司可以有多个子公司,一个子公司子有多个部门。

其实就是一张表,

例子程序:

Organization类:

package com.oracle.hibernate;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;


@Entity
public class Organization {

    private int id;
    private String name;
    //父机构
    private Organization  parent;
    //一个父机构可有多个子机构
    private Set<Organization> children = new HashSet<Organization>();
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 对于父机构:多对一
     * pid是本机构的外键,指向父机构的标识,其实就是指向父机构的id
     */
    @ManyToOne
    @JoinColumn(name="pid")
    public Organization getParent() {
        return parent;
    }
    public void setParent(Organization parent) {
        this.parent = parent;
    }
    /**
     * 对于子机构:一对多
     *设mappedBy,
     *fetch=EAGER可以加载父机构时全部加载子机构。机构树小 时可以用,树大时可用ajax异步
     *
     */
    @OneToMany(mappedBy="parent",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    public Set<Organization> getChildren() {
        return children;
    }

    public void setChildren(Set<Organization> children) {
        this.children = children;
    }
    
    
}

测试类:

package com.oracle.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;

public class Test {

    private static SessionFactory sf = null;

    @BeforeClass
    public static void beforeClass() {

        try {
            // 生成表
            new SchemaExport(new AnnotationConfiguration().configure()).create(
                    false, true);
            sf = new AnnotationConfiguration().configure()
                    .buildSessionFactory();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @org.junit.Test
    public void testSchemaExport() {
        new SchemaExport(new AnnotationConfiguration().configure()).create(
                false, true);

    }

    @AfterClass
    public static void afterClass() {
        sf.close();
    }

    @org.junit.Test
    public void testSave() {

        Session s = sf.getCurrentSession();
        s.beginTransaction();

        Organization org = new Organization();
        org.setName("总公司");

        Organization org2 = new Organization();
        Organization org3 = new Organization();
        Organization org4 = new Organization();
        Organization org5 = new Organization();
        org2.setName("分公司1");
        org3.setName("分公司2");
        org4.setName("分公司1_部门1");
        org5.setName("分公司1_部门2");

        org2.setParent(org);
        org3.setParent(org);
        org4.setParent(org2);
        org5.setParent(org2);

        org.getChildren().add(org2);
        org.getChildren().add(org3);
        org.getChildren().add(org4);
        org.getChildren().add(org5);

        s.save(org);
        s.getTransaction().commit();
    }

    @org.junit.Test
    public void testLoad() {
        testSave();// 生成数据
        Session s = sf.getCurrentSession();
        s.beginTransaction();
        Organization org = (Organization) s.load(Organization.class, 1);
        print(org, 0);
        s.getTransaction().commit();

    }

    // 递归显示目录结构
    private void print(Organization org, int level) {// level标识级别
        String preStr = "";
        for (int i = 0; i < level; i++) {
            preStr += "---"; // 级别往下一级,缩进
        }
        System.out.println(preStr + org.getName());

        for (Organization o : org.getChildren()) {

            print(o, level + 1);
        }

    }
}

生成的表:

打印树状结构:

总公司
---分公司1
------分公司1_部门2
------分公司1_部门1
---分公司2

原文地址:https://www.cnblogs.com/lihaoyang/p/4926394.html