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()方法,表中的數據為:

                        

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM