zoukankan      html  css  js  c++  java
  • JPA树形结构实体关系映射

      有时候我们需要设计树形结构实体,比如常见的部门组织就是典型的树形结构。

      1、组织架构实体代码:

    package cn.luxh.jpa.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    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;
    import javax.persistence.Table;
    
    
    
    /**
     * 组织架构
     * @author Luxh
     */
    @Entity
    @Table(name="t_organization")
    public class Organization {
        
        @Id
        @GeneratedValue
        private Long id;
        
        /**组织名称*/
        @Column(length=64)
        private String name;
        
        /**组织编码*/
        @Column(length=64)
        private String code;
        
        /**父组织*/
        @ManyToOne
        @JoinColumn(name="parent_id")
        private Organization parent;
        
        /**子组织*/
        @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
        @JoinColumn(name="parent_id")
        private Set<Organization> children = new HashSet<Organization>();
        
        //省略get/set方法
        //...
        
    }

      JPA生成的对应表结构为:

                                      

      2、单元测试代码:

    package cn.luxh.jpa.test;
    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import cn.luxh.jpa.entity.Organization;
    
    
    
    public class JPATest {
        
        EntityManagerFactory emf = null;
        
        @Before
        public void before() {
            //根据在persistence.xml中配置的persistence-unit name 创建EntityManagerFactory
            emf = Persistence.createEntityManagerFactory("myJPA");
        }
        
        /**
         * 保存父组织,级联保存子组织
         */
        @Test
        public void testAddParentOrg() {
            
            //父组织
            Organization chinaOrg = new Organization();
            chinaOrg.setName("中国");
            chinaOrg.setCode("CHINA");
            
            //子组织
            Organization gdOrg = new Organization();
            gdOrg.setName("广东");
            gdOrg.setCode("GD");
            
            //子组织
            Organization gxOrg = new Organization();
            gxOrg.setName("广西");
            gxOrg.setCode("GX");
            
            Set<Organization> children = new HashSet<Organization>();
            children.add(gdOrg);
            children.add(gxOrg);
            
            //添加子组织
            chinaOrg.setChildren(children);
            
            EntityManager em = emf.createEntityManager();
            em.getTransaction().begin();
            em.persist(chinaOrg);
            em.getTransaction().commit();
            em.close();
        }
        
        /**
         * 保存子组织
         */
        @Test
        public void testAddChildOrg() {
            
            
            Organization gzOrg = new Organization();
            gzOrg.setName("广州");
            gzOrg.setCode("GZ");
            
            
            EntityManager em = emf.createEntityManager();
            //找出广州所属的父组织广东
            Organization parent = em.find(Organization.class, 3L);
            //设置广州的父组织
            gzOrg.setParent(parent);
                    
            em.getTransaction().begin();
            //保存广州
            em.persist(gzOrg);
            em.getTransaction().commit();
            em.close();
        }
        
        /**
         * 根据子组织查询父组织
         */
        @Test
        public void testQueryParentByChild() {
            EntityManager em = emf.createEntityManager();
            //找出广州
            Organization gzOrg = em.find(Organization.class, 4L);
            //找出父组织
            Organization parent = gzOrg.getParent();
            System.out.println("父组织名称:"+parent.getName());
            em.close();
        }
        
        /**
         * 根据父组织查询子组织
         */
        @Test
        public void testQueryChildrenByParent() {
            EntityManager em = emf.createEntityManager();
            //找出广东
            Organization gdOrg = em.find(Organization.class, 3L);
            //找出子组织
            Set<Organization> children = gdOrg.getChildren();
            Iterator<Organization> it = children.iterator();
            while(it.hasNext()) {
                Organization  child = it.next();
                System.out.println("子组织名称:"+child.getName());
            }
            em.close();
        }
        
            
        /**
         * 关闭EntityManagerFactory
         */
        @After
        public void after() {
            if(null != emf) {
                emf.close();
            }
        }
    
    }

      1)执行完testAddParentOrg()方法,表中的数据为:

                                                                       

      2)执行完testAddChildOrg()方法,表中的数据为:

                            

      

  • 相关阅读:
    翻转单词顺序
    java layout 表格项增加、删除、修改
    Hadoop学习之HBase
    protected的一些功能
    hdu4431 Mahjong
    kendo ui gird温馨提示(使用本地数据) 一个
    TOP计划猿10最佳实践文章
    Java高级应用(一个)-文件夹监控服务
    BSD介绍
    获取编译学习笔记 (十三)—— 外部中断
  • 原文地址:https://www.cnblogs.com/luxh/p/2591333.html
Copyright © 2011-2022 走看看