通过Hibernate创建的Region表结构是id、name、parent_id
Region类代码:
@Entity
public class Region {
private int id;
private String name;
private Set<Region> childs=new HashSet<Region>();
private Region 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<Region> getChilds() {
return childs;
}
public void setChilds(Set<Region> childs) {
this.childs = childs;
}
@ManyToOne
@JoinColumn(name="parent_id")
public Region getParent() {
return parent;
}
public void setParent(Region parent) {
this.parent = parent;
}
}
测试类:
public class Hibernate_ORMappingTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass(){
new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);
sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
System.out.println("before");
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}
@Test
public void testTree(){
System.out.println("1");
}
@Test
public void saveRegion(){
Region r=new Region();
Region r1=new Region();
Region r2=new Region();
Region r3=new Region();
r.setName("福建");
r1.setName("福州");
r2.setName("厦门");
r3.setName("鼓楼区");
r1.setParent(r);
r2.setParent(r);
r3.setParent(r1);
r.getChilds().add(r1);
r.getChilds().add(r2);
r1.getChilds().add(r3);
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(r);
session.getTransaction().commit();
}
@Test
public void loadRegion(){
this.saveRegion();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
Region r=(Region)session.load(Region.class, 1);
print(r,0);
}
private void print(Region r,int level){
String preStr="";
for(int i=0;i<level;i++){
preStr+="--";
}
System.out.println(preStr+r.getName());
for(Region child:r.getChilds()){
print(child,level+1);
}
}
}
可以将区域对象看成2个对象。一个是父类,一个是子类。
对于父类来说,它与子类的关系是一对多;对于子类来说,它与父类的关系是多对一。由于父类和子类都存在对方的对象引用,因此它们之间的关系是一对多,多对一之间的双向关联。因此需要设置mappedby,以及测试代码中的父类与子类、子类与父类之间的关系都要设置好。
加载树状结构的时候需要用到递归。Region类 fetch=FetchType.EAGER,取父类的时候也会将子类一并取出。这样一般适用于树状结构不复杂的情况。当然也可以默认设置为lazy,当有需要的时候再取出。