Hibernate 树状映射

示例:

类Org表示组织机构,是一个典型的树状结构数据,其属性包括:

id,name,children,parent

要将Org映射到数据库中,对parent作多对一的映射,对children作一对多的映射。

 

我们可以通过三张表来解释其关系

1

 

代码实现:

1.建Org实体类

@Entity
public class Org {
	private int id;
	private String name;
	private Set<Org> childen = new HashSet<Org>();
	private Org parent;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@OneToMany(mappedBy="parent",cascade={CascadeType.ALL},fetch=FetchType.EAGER)
	public Set<Org> getChilden() {
		return childen;
	}
	public void setChilden(Set<Org> childen) {
		this.childen = childen;
	}
	@ManyToOne
	public Org getParent() {
		return parent;
	}
	public void setParent(Org parent) {
		this.parent = parent;
	}
}

2.建Junit测试类

@Test
public void testDelete() {
	new SchemaExport(new Configuration().configure()).create(true, true);
			
}

运行程序,在数据库中自动生成表org,有3个属性:id,name,parent_id(外键)

3.存储数据

@Test
public void testSave() {
		
	Session session = sf.getCurrentSession();
	session.beginTransaction();
		
	Org o = new Org();
	o.setName("总公司");
		
	Org o1 = new Org();
	o1.setName("分公司1");
		
	Org o2 = new Org();
	o2.setName("分公司2");
		
	Org o11 = new Org();
	o11.setName("分公司1_部门1");
		
	Org o12 = new Org();
	o12.setName("分公司1_部门2");
		
	Org o21 = new Org();
	o21.setName("分公司2_部门1");
		
	o.getChilden().add(o1);
	o.getChilden().add(o2);
	o1.getChilden().add(o11);
	o1.getChilden().add(o12);
	o2.getChilden().add(o21);
		
		
	o11.setParent(o1);
	o12.setParent(o1);
	o21.setParent(o2);
	o1.setParent(o);
	o2.setParent(o);
		
	session.save(o);

	session.getTransaction().commit();		
}

4.打印输出

@Test
public void testLoad() {
	
	Session session = sf.getCurrentSession();
	session.beginTransaction();
	
	Org o = (Org) session.load(Org.class, 1);
	print(o,0);

	session.getTransaction().commit();		
}

//通过递归方式,以树状结构,打印输出各对象的名字
private void print(Org o,int level) {
	for(int i=0;i<level;i++){
		System.out.print("----");
	}
	System.out.println(o.getName());
	for(Org child : o.getChilden()){
		print(child,level+1);
	}
}
输出结果
总公司
----分公司1
--------分公司1_部门2
--------分公司1_部门1
----分公司2
--------分公司2_部门1
 
posted @ 2014-08-11 22:02  小样儿1020  阅读(208)  评论(0编辑  收藏  举报