JPA树形结构实体关系映射

来源:互联网 发布:汉诺塔非递归算法java 编辑:程序博客网 时间:2024/06/07 23:59

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

  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()方法,表中的数据为:

                        

  

0 0