有時候我們需要設計樹形結構實體,比如常見的部門組織就是典型的樹形結構。
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()方法,表中的資料為: