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)