Hibernate学习笔记(六) --- 使用Hibernate创建一个树

树也是一种一对多的关系,同普通一对多关系的区别在于他的“一”的一方及“多”的一方均是同一类对象,因此可以用一对多来实现树,唯一的区别是将映射的对象类型设置为自身即可

以Person对象为例,人类有父亲及孩子,其中父亲只有一个,孩子有多个,父亲是Person对象,孩子是Person对象的集合

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 import javax.persistence.CascadeType;
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.FetchType;
 8 import javax.persistence.Id;
 9 import javax.persistence.JoinColumn;
10 import javax.persistence.ManyToOne;
11 import javax.persistence.OneToMany;
12 
13 @Entity(name = "Person")
14 public class Person {
15     @Id
16     @Column(name = "NAME", length = 50)
17     private String name;
18 
19     @ManyToOne
20     @JoinColumn(name = "PARENTID")
21     private Person parent;
22 
23     @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
24     private List<Person> children = new ArrayList<Person>();
25 
26     public Person() {
27     }
28 
29     public Person(String name) {
30         this.name = name;
31     }
32 
33     public List<Person> getChildren() {
34         return children;
35     }
36 
37     public void addChild(Person person) {
38         children.add(person);
39         person.setParent(this);
40     }
41 
42     public void removeChild(Person person) {
43         children.remove(person);
44         person.setParent(null);
45     }
46 
47     public Person getParent() {
48         return parent;
49     }
50 
51     public void setParent(Person parent) {
52         this.parent = parent;
53     }
54 }

构建测试用例如下:

import study.hibernate.SessionManager;

public class Launcher {
    public static void main(String[] args) {
        Person person = new Person("张三");
        SessionManager.add(person);
        Person person1 = new Person("李四");
        SessionManager.add(person1);
        Person person2 = new Person("王五");
        SessionManager.add(person2);
        Person person3 = new Person("赵六");
        SessionManager.add(person3);

        person.addChild(person1);
        person1.addChild(person2);
        person1.addChild(person3);
        SessionManager.update(person);
        
//        person.removeChild(person1);
//        SessionManager.update(person);

        SessionManager.close();

    }
}

运行完毕后,查看数据库中数据,结构如下,满足树形要求:

mysql> SELECT * FROM PERSON;
+--------+----------+
| NAME   | PARENTID |
+--------+----------+
| 张三   | NULL     |
| 李四   | 张三     |
| 王五   | 李四     |
| 赵六   | 李四     |
+--------+----------+
4 rows in set (0.00 sec)

 

posted @ 2017-11-08 22:48  smart_妖  阅读(515)  评论(0编辑  收藏  举报