(13)树状结构
来源:互联网 发布:淘宝瑞滢星星口碑 编辑:程序博客网 时间:2024/06/08 18:26
树状图是一种数据结构 ,它由n个有限节点组成一个具有层次关系的集合。每个节点有0或者多个子节点,没有父节点的节点是根节点,每个非根节点只有一个父节点,除了根节点外每个子节点可以分为多个不相交的子树。树种每个节点是相同的数据类型。
在日常生活中,也有许多这样的例子,比如一个总公司,可以有多个子公司,一个子公司又会有多个部门,因为每个子节点只能有一个父节点,所以上下层之间的关系是onetomany 和manytoone的关系。
所以确定了类里面应有的属性 id set<Org>
(manytoone)Org(onetomany) 。之前学的group、user是两张表,这里是一张表
存储在数据库中的表如下,通过父节点来确定是谁的孩子。那么若想要求一个节点(如id=0)的孩子有哪些,则select * from Org where parent_id=0。若想要求一个节点(如id=1)的父节点,则select * from Org where id=1;
id Parent_id name0 null 总公司1 0 分公司12 0 分公司23 2 分公司2_1
@Entitypublic class Org { private int id; private String name; private Set<Org> children=new HashSet<Org>(); private Org 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)//在表中,是在many中有one的id ,只有OneToMany中有mappedBy manytoone中没有 public Set<Org> getChildren() { return children; } public void setChildren(Set<Org> children) { this.children = children; } @ManyToOne(cascade=CascadeType.ALL)//因为是双向的,所以要设mappedBy @JoinColumn(name="p_id") public Org getParent() { return parent; } public void setParent(Org parent) { this.parent = parent; }}
Test
@org.junit.Test public void Save(){ Org o=new Org(); o.setName("总公司"); Org o1=new Org(); o1.setName("分公司1"); Org o2=new Org(); o2.setName("分公司2"); Org o11=new Org(); o11.setName("分公司11"); Org o12=new Org(); o12.setName("分公司12"); //要设置好他们之间的关系 o.getChildren().add(o2); o.getChildren().add(o1); o1.getChildren().add(o11); o1.getChildren().add(o12); o1.setParent(o); o2.setParent(o); o11.setParent(o1); o12.setParent(o1); Session session=sf.getCurrentSession(); session.beginTransaction(); session.save(o);//因为org已经设置为级联操作,所以可以全部插入 /* * 插入过程 * 插入o,因为o级联操作,会将它的孩子,全部插入。然后再插入o2 */ session.getTransaction().commit(); } @org.junit.Test public void read() { Save(); Session session=sf.getCurrentSession(); session.beginTransaction(); Org o=(Org) session.get(Org.class, 1); print(o,0); /*one to many fetch=EAGER * 先输出总公司,然后输出分公司11、12 然后输出 2 */ session.getTransaction().commit(); } /*总公司----分公司1--------分公司11--------分公司12----分公司2 */ //树递归输出 private void print(Org o,int level ) { String preStr="";//产出缩进 for(int i=0;i<level;i++){ preStr+="----"; } System.out.println(preStr+o.getName()); for(Org child:o.getChildren()){ print(child,level+1); } }
阅读全文
0 0
- (13)树状结构
- 树状结构(经典)
- 树状结构
- 树状结构
- 树状结构
- json转树状结构(js)
- json转树状结构(js)
- 数据结构系列(5)树状结构
- Hibernate表现树状结构
- 无限树状结构逻辑
- 树状结构代码
- hibernate树状结构
- 【Oracle】树状结构查询
- 树状结构的设计
- GridView树状结构显示
- 打印树状结构
- 数据库树状结构构建
- 树状结构的实现
- 弹 窗口 设计
- 权限访问之判断——hibernate用户、角色、请求三表ManyToMany关联查询
- PHP内存管理机制与垃圾回收机制
- MySql的锁
- Android service显示系统对话框
- (13)树状结构
- Android WebView重定向问题的解决方案
- GIT如何删除分支
- 命令行 更新Android sdk
- Linux安装MySQL
- 随机获取数Month.random 及在js中获取n位相互不重复的数据
- Spring Transaction属性之Propagation
- FileDisk源码分析
- 小米手机谈Toast