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

Hibernate——树状映射


树状映射

假设:

一张表的结构如下:

id

parent_id

name

 

 

 

公司组织架构即树状映射

范例:

package com.zgy.hibernate.model;

 

import java.util.HashSet;

import java.util.Set;

 

import javax.persistence.CascadeType;

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;

 

 

/*

 * Org类,表示组织架构的类

 */

@Entity

public class Org {

private int id;//编号

private String name;//名称

private Set<Org> children = new HashSet<Org>();//Org的子类

private Org parent;//Org的父类

@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(cascade=CascadeType.ALL,mappedBy="parent",fetch=FetchType.EAGER)

public Set<Org> getChildren() {

return children;

}

public void setChildren(Set<Org> children) {

this.children = children;

}

@ManyToOne

@JoinColumn(name="parent_id")

public Org getParent() {

return parent;

}

public void setParent(Org parent) {

this.parent = parent;

}

}

 

 

测试:

package com.zgy.hibernate.model;

 

import java.util.Date;

import java.util.List;

 

import org.hibernate.Query; 

 

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

 

public class HibernateTreeTest {

private static SessionFactory sf;

@BeforeClass

public static void beforeClass() {

sf = new AnnotationConfiguration().configure().buildSessionFactory();

}

@AfterClass

public static void afterClass() {

sf.close();

}

@Test

public void testSchemaExport() {

new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);

}

@Test

public void testSave() {

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");

o.getChildren().add(o1);

o.getChildren().add(o2);

o1.getChildren().add(o11);

o2.getChildren().add(o12);

o11.setParent(o1);

o12.setParent(o1);

o1.setParent(o);

o2.setParent(o);

Session session = sf.openSession();

session.beginTransaction();

session.save(o);

session.getTransaction().commit();

session.close();

}

@Test

public void testLoad(){

testSave();

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) {

String preStr = "";

for(int i = 0 ; i < level ; i++){

preStr += "----";

}

System.out.println(preStr+o.getName());

for(Org child : o.getChildren()){

print(child,level+1);

}

}

public static void main(String[] args) {

beforeClass();

}

}



技术分享

Hibernate——树状映射