您的位置:首页 > 其它

JPA树形结构实体关系映射

2012-07-14 11:28 441 查看
  有时候我们需要设计树形结构实体,比如常见的部门组织就是典型的树形结构。

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

                        


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: