什么是hibernate树状结构?
一个公司可能有很多个子公司,子公司下面可能还有孙子公司,子公司里面还有很多部门,
这就组成一棵树。在数据库表中,使用的是id和pid(parent_id)。通过id和pid就存放一颗树了。
代码如下:
@Entity
@Table(name="T_COMPANY")
public class Company {
private int id;
private String name;
//"一对多"
private Set<Company>children=new HashSet<Company>();
//"多对一"
private Company parent;
@Id
@GeneratedValue
public int getId() {
return id;
}
@OneToMany (mappedBy="parent",
cascade={CascadeType.ALL},
fetch=FetchType.EAGER
)
public void setChildren(Set<Company> children) {
this.children = children;
}
@ManyToOne(
cascade={CascadeType.ALL}
)
@JoinColumn(name="parent_id")
public Company getParent() {
return parent;
}
//省略无关set/get...
}
@Test
public void save(){
Company c = new Company();
c.setName("总");
Company c1 = new Company();
c1.setName("分1");
Company c2 = new Company();
c2.setName("分2");
Company c11 = new Company();
c11.setName("分1——部门1");
Company c12 = new Company();
c12.setName("分1——部门2");
c.getChildren().add(c2);
c.getChildren().add(c1);
c1.getChildren().add(c11);
c1.getChildren().add(c12);
c11.setParent(c1);
c12.setParent(c1);
c1.setParent(c);
c2.setParent(c);
Configuration config=new AnnotationConfiguration();
SessionFactory factory=config.configure().buildSessionFactory();
Session session=factory.getCurrentSession();
session.beginTransaction();
session.save(c);
session.getTransaction().commit();
factory.close();
}
@Test
public void load(){
save();
Configuration config=new AnnotationConfiguration();
SessionFactory factory=config.configure().buildSessionFactory();
Session session=factory.getCurrentSession();
session.beginTransaction();
Company co=(Company)session.load(Company.class, 1);
print(co,0);//把co打印出来。建print方法
session.getTransaction().commit();
factory.close();
}
//print(co,0);这个方法递归调用打印出这棵树。
private void print(Company co , int level) {
String str="";
for(int i=0;i<level;i++){
str+="****";
}
System.out.println(str+co.getName());
for(Company child : co.getChildren()) {
print(child,level+1);
}
}
总
**分2
**分1
**分1——部门1
**分1——部门2