Hibernate 另一个作业:Org树状结构设计

来源:互联网 发布:topsir 知乎 编辑:程序博客网 时间:2024/05/22 15:22

这个相比刚刚那个就不太重要了,但本身也很重要的。

要求:同一个类中使用One2Many,Many2One两种关系。

1.分析关系。所以只有一个类,类中有应该有父节点与子节点,parent,children

parent---------org                     ManyToOne

org-------------children            OneToMany(cascade=CascadeType.ALL)

2.具体设计如下

org类中:id,

                    @ManyToOne  @JoinColumn(name="parent")

                    parent

                   @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)

                   children

3.测试代码比较复杂,因为要打印出来层级的树状结构,所以要用递归的方式加上前缀字符串。

贴下测试的代码过来:

testSave:(跟老师的代码基本一样)

Session s = sf.getCurrentSession();
s.beginTransaction();

Org2 o = new Org2();//对象赋值
o.setName("总公司");
Org2 o1 = new Org2();
o1.setName("子公司1");
Org2 o2 = new Org2();
o2.setName("子公司2");
Org2 o11 = new Org2();
o11.setName("子公司1的子公司1");
Org2 o21 = new Org2();
o21.setName("子公司2的子公司1");

o.getChildren().add(o1);
o.getChildren().add(o2);
o1.getChildren().add(o11);
o2.getChildren().add(o21);

o1.setParent(o);
o2.setParent(o);
o11.setParent(o1);
o21.setParent(o2);

s.save(o);//多方便,hibernate优点的体现!
s.getTransaction().commit();

Load并打印的测试代码:(跟老师的也差不多一样)

@Test
public void testLoad() {
testSave();
Session s = sf.getCurrentSession();
s.beginTransaction();

Org2 o = (Org2) s.get(Org2.class, 1);//数据库到对象的转换
print(o, 0);//打印方法
s.getTransaction().commit();
}

 private void print(Org2 o, int level) {//打印出树状结构的方法
String strBuilder = "";
for (int i = 0; i <= level; i++) {//起作用,搞出层
strBuilder += "----";
}
System.out.println(strBuilder + o.getName());
for (Org2 org : o.getChildren()) {
print(org, level + 1);//递归调用自身,打印深层节点
  }}

总结:做了两个作业,再有代码的情况下都做出来了,但是觉得对关系的理解还是有点不到位,总会有点蒙的成分在里面,要勤加练习啊!!