首页 > 代码库 > Hibernate 树状映射

Hibernate 树状映射

示例:

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

id,name,children,parent

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

 

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

1

 

代码实现:

1.建Org实体类

@Entitypublic 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测试类

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

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

3.存储数据

@Testpublic 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.打印输出

@Testpublic 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