zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#动态显示时间
    死锁问题
    TCP_NODELAY算法使用事项
    二叉搜索树的后序遍历
    从上到下打印二叉树
    栈的压入、弹出序列
    包含min函数的栈
    顺时针打印矩阵
    树的子结构
    合并两个排序链表
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4926394.html
Copyright © 2011-2022 走看看