package com.pt.treeStrut;

 import java.util.Set;

 import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; @Entity
public class ArticleTree {
int id;
String title;
String content;
ArticleTree p_article; Set<ArticleTree> sons; @OneToMany(mappedBy="p_article",cascade=CascadeType.ALL)
public Set<ArticleTree> getSons() {
return sons;
} public void setSons(Set<ArticleTree> sons) {
this.sons = sons;
}
public ArticleTree(){ }
public ArticleTree(int id, String title, String content){
setId(id);
setTitle(title);
setContent(content);
}
@Id
//@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
} @ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="parent_id")
public ArticleTree getP_article() {
return p_article;
}
public void setP_article(ArticleTree p_article) {
this.p_article = p_article;
} @Override
public String toString() {
// TODO Auto-generated method stub
return title + " " + content;
} }

ArticleTree.java

 import java.sql.Connection;
import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.pt.hibernate.Student;
import com.pt.hibernate.Teacher;
import com.pt.treeStrut.ArticleTree; public class Test {
public static void main(String[] arges){
Configuration cfg = new Configuration();
SessionFactory factory = cfg.configure().buildSessionFactory();
//Session ss=factory.openSession();
Session ss= factory.getCurrentSession();
// Teacher hong = new Teacher();
// hong.setName("gaolihong");
// hong.setCourese("english");
//
// Set<Student> students=new HashSet<Student>();
// Student student = new Student();
// student.setId(2);
// student.setSchoolName("DuYangGang2");
// students.add(student);
// hong.setMyStudents(students);
ss.beginTransaction();
// ss.save(hong);
// ss.getTransaction().commit();
ArticleTree a_p = new ArticleTree(1000,"第一章","导论");
ArticleTree a_s1 = new ArticleTree(1001,"第一节","导论——1");
ArticleTree a_s2 = new ArticleTree(1002,"第二节","导论——2"); ArticleTree a_p1 = new ArticleTree(2000,"第二章","光学");
ArticleTree a_s11 = new ArticleTree(2001,"第一节","光学——1");
ArticleTree a_s12 = new ArticleTree(2002,"第二节","光学——2"); a_s11.setP_article(a_p1);
a_s12.setP_article(a_p1);
a_p1.setSons(new HashSet<ArticleTree>()); //否则会报空指针异常
a_p1.getSons().add(a_s11);
a_p1.getSons().add(a_s12); a_s1.setP_article(a_p);
a_s2.setP_article(a_p);
a_p.setSons(new HashSet<ArticleTree>());
a_p.getSons().add(a_s1);
a_p.getSons().add(a_s2); ArticleTree all = new ArticleTree(1,"物理","物理");
a_p1.setP_article(all);
a_p.setP_article(all);
all.setSons(new HashSet<ArticleTree>()); //否则会报空指针异常
all.getSons().add(a_p);
all.getSons().add(a_p1); //ss.save(all); //由于设置了cascade,存储一个,整个树都会存储进去 //ss.save(a_s1);
ss.save(a_s1); //由于设置了cascade,存储一个,整个树都会存储进去
ss.getTransaction().commit();
//ss.close(); //getsession 不用close /****取出树来,并打印*******/
Session ss2= factory.getCurrentSession();
ss2.beginTransaction();
ArticleTree getAll = ss2.load(ArticleTree.class, 1); //取出父节点
printTree(getAll,0);
ss2.getTransaction().commit();
factory.close();
} public static void printTree(ArticleTree parent,int level){
for(int i = 0; i< level; i++){
System.out.print("--");
}
System.out.println(parent);
for(ArticleTree article : parent.getSons()){
printTree(article, level + 1);
}
}
}

test

PS:开发过程中写的bug:

  1、commit的时候提示没有session   原因:session没有beginTransion

  2、提示set<sons>  字段找不到匹配的数据库字段类型,  原因:@oneTomany 写在了get上

hibernate —— 树状存储的更多相关文章

  1. hibernate树状映射

    例如公司的组织机构:一个公司可以有多个子公司,一个子公司子有多个部门. 其实就是一张表, 例子程序: Organization类: package com.oracle.hibernate; impo ...

  2. UVA 1513 Movie collection (树状数组+反向存储)

    题意:给你n盘歌碟按照(1....n)从上到下放,接着m个询问,每一次拿出x碟,输出x上方有多少碟并将此碟放到开头 直接想其实就是一线段的区间更新,单点求值,但是根据题意我们可以这样想 首先我们倒着存 ...

  3. Hibernate 再接触 树状结构设计以及学生课程成绩表的设计

    1 树状结构的设计 package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax. ...

  4. HDU 4605 Magic Ball Game (dfs+离线树状数组)

    题意:给你一颗有根树,它的孩子要么只有两个,要么没有,且每个点都有一个权值w. 接着给你一个权值为x的球,它从更节点开始向下掉,有三种情况 x=w[now]:停在此点 x<w[now]:当有孩子 ...

  5. Stars_树状数组

    Problem Description Astronomers often examine star maps where stars are represented by points on a p ...

  6. UVALive 2191 Potentiometers (树状数组)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. 2016 大连网赛---Weak Pair(dfs+树状数组)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 Problem Description You are given a rooted ...

  8. 学习笔记 BIT(树状数组)

    痛定思痛,打算切割数据结构,于是乎直接一发BIT 树状数组能做的题目,线段树都可以解决 反之则不能,不过树状数组优势在于编码简单和速度更快 首先了解下树状数组: 树状数组是一种操作和修改时间复杂度都是 ...

  9. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

随机推荐

  1. Node.js:url

    在node运行环境中输入url: > url url { parse: [Function: urlParse], resolve: [Function: urlResolve], resolv ...

  2. 【Sort】QuickSort

    快速排序,平均运行时间O(N log N),最坏运行时间O(N^2). 我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html ...

  3. mybatis 批量插入值的sql

    <insert id="insertAwardPic" useGeneratedKeys="true" parameterType="java. ...

  4. JMS理解2

    使用JMS 的应用程序被称为JMS 客户端,处理消息路由与传递的消息系统被称为JMS Provider,而JMS 应用则是由多个JMS 客户端和一个JMS Provider 构成的业务系统.发送消息的 ...

  5. C# 语言规范_版本5.0 (第0章 目录)

    C# 语言规范 版本5.0 注意 © 1999-2012 Microsoft Corporation.保留所有权利. Microsoft.Windows.Visual Basic.Visual C# ...

  6. 使用 mulan-1.5.0 如何构造.arff文件

    1. 为什么要使用mulan 我用mulan来做多标签数据的分类,但是mulan的输入数据由两个文件控制,一个是data.arff文件,这个文件列出的所有的属性以及这些属性值的类型和他们对应的值.la ...

  7. ural 1073.Square Country(动态规划)

    1073. Square Country Time limit: 1.0 secondMemory limit: 64 MB There live square people in a square ...

  8. Mybatis批量更新数据

    转载:http://blog.csdn.net/tolcf/article/details/39213217 第一种方式 <update id="updateBatch" p ...

  9. BJFU 1397 致我们终将逝去的爱情

      LIS 由于要记录轨迹,所以不能用O(nlogn)优化,直接dp加father记录每个节点的转移. #include<cstdio> #include<algorithm> ...

  10. Linux 内核协议栈之TCP连接关闭

    Close行为: 当应用程序在调用close()函数关闭TCP连接时,Linux内核的默认行为是将套接口发送队列里的原有数据(比如之前残留的数据)以及新加入 的数据(比如函数close()产生的FIN ...