这个相比刚刚那个就不太重要了,但本身也很重要的。
要求:同一个类中使用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);//递归调用自身,打印深层节点
}}
总结:做了两个作业,再有代码的情况下都做出来了,但是觉得对关系的理解还是有点不到位,总会有点蒙的成分在里面,要勤加练习啊!!