例如公司的组织机构:一个公司可以有多个子公司,一个子公司子有多个部门。

其实就是一张表,

例子程序:

Organization类:

  1. package com.oracle.hibernate;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. import javax.persistence.CascadeType;
  7. import javax.persistence.Entity;
  8. import javax.persistence.FetchType;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.JoinColumn;
  12. import javax.persistence.ManyToOne;
  13. import javax.persistence.OneToMany;
  14.  
  15. @Entity
  16. public class Organization {
  17.  
  18. private int id;
  19. private String name;
  20. //父机构
  21. private Organization parent;
  22. //一个父机构可有多个子机构
  23. private Set<Organization> children = new HashSet<Organization>();
  24.  
  25. @Id
  26. @GeneratedValue
  27. public int getId() {
  28. return id;
  29. }
  30. public void setId(int id) {
  31. this.id = id;
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. /**
  40. * 对于父机构:多对一
  41. * pid是本机构的外键,指向父机构的标识,其实就是指向父机构的id
  42. */
  43. @ManyToOne
  44. @JoinColumn(name="pid")
  45. public Organization getParent() {
  46. return parent;
  47. }
  48. public void setParent(Organization parent) {
  49. this.parent = parent;
  50. }
  51. /**
  52. * 对于子机构:一对多
  53. *设mappedBy,
  54. *fetch=EAGER可以加载父机构时全部加载子机构。机构树小 时可以用,树大时可用ajax异步
  55. *
  56. */
  57. @OneToMany(mappedBy="parent",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
  58. public Set<Organization> getChildren() {
  59. return children;
  60. }
  61.  
  62. public void setChildren(Set<Organization> children) {
  63. this.children = children;
  64. }
  65.  
  66. }

测试类:

  1. package com.oracle.hibernate;
  2.  
  3. import org.hibernate.HibernateException;
  4. import org.hibernate.Session;
  5. import org.hibernate.SessionFactory;
  6. import org.hibernate.cfg.AnnotationConfiguration;
  7. import org.hibernate.tool.hbm2ddl.SchemaExport;
  8. import org.junit.AfterClass;
  9. import org.junit.BeforeClass;
  10.  
  11. public class Test {
  12.  
  13. private static SessionFactory sf = null;
  14.  
  15. @BeforeClass
  16. public static void beforeClass() {
  17.  
  18. try {
  19. // 生成表
  20. new SchemaExport(new AnnotationConfiguration().configure()).create(
  21. false, true);
  22. sf = new AnnotationConfiguration().configure()
  23. .buildSessionFactory();
  24. } catch (HibernateException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. }
  29.  
  30. @org.junit.Test
  31. public void testSchemaExport() {
  32. new SchemaExport(new AnnotationConfiguration().configure()).create(
  33. false, true);
  34.  
  35. }
  36.  
  37. @AfterClass
  38. public static void afterClass() {
  39. sf.close();
  40. }
  41.  
  42. @org.junit.Test
  43. public void testSave() {
  44.  
  45. Session s = sf.getCurrentSession();
  46. s.beginTransaction();
  47.  
  48. Organization org = new Organization();
  49. org.setName("总公司");
  50.  
  51. Organization org2 = new Organization();
  52. Organization org3 = new Organization();
  53. Organization org4 = new Organization();
  54. Organization org5 = new Organization();
  55. org2.setName("分公司1");
  56. org3.setName("分公司2");
  57. org4.setName("分公司1_部门1");
  58. org5.setName("分公司1_部门2");
  59.  
  60. org2.setParent(org);
  61. org3.setParent(org);
  62. org4.setParent(org2);
  63. org5.setParent(org2);
  64.  
  65. org.getChildren().add(org2);
  66. org.getChildren().add(org3);
  67. org.getChildren().add(org4);
  68. org.getChildren().add(org5);
  69.  
  70. s.save(org);
  71. s.getTransaction().commit();
  72. }
  73.  
  74. @org.junit.Test
  75. public void testLoad() {
  76. testSave();// 生成数据
  77. Session s = sf.getCurrentSession();
  78. s.beginTransaction();
  79. Organization org = (Organization) s.load(Organization.class, 1);
  80. print(org, 0);
  81. s.getTransaction().commit();
  82.  
  83. }
  84.  
  85. // 递归显示目录结构
  86. private void print(Organization org, int level) {// level标识级别
  87. String preStr = "";
  88. for (int i = 0; i < level; i++) {
  89. preStr += "---"; // 级别往下一级,缩进
  90. }
  91. System.out.println(preStr + org.getName());
  92.  
  93. for (Organization o : org.getChildren()) {
  94.  
  95. print(o, level + 1);
  96. }
  97.  
  98. }
  99. }

生成的表:

打印树状结构:

总公司
---分公司1
------分公司1_部门2
------分公司1_部门1
---分公司2

hibernate树状映射的更多相关文章

  1. hibernate —— 树状存储

    package com.pt.treeStrut; import java.util.Set; import javax.persistence.CascadeType; import javax.p ...

  2. Hibernate:组合模式解决树的映射

    树经常用来展示目录结构,那么在Hibernate中怎样解决树的映射问题呢? 先来看一个分销商的树形结构的例子 所有分销商 东北区 辽宁省 沈阳医药 吉林省 华北区 北京市 北京医药 河北省 华南区 那 ...

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

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

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

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

  5. 线段树或树状数组---Flowers

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=4325 Description As is known to all, the blooming tim ...

  6. 洛谷 P1908 逆序对 Label:归并排序||树状数组 不懂

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

  7. FZU 2029 买票问题 树状数组+STL

    题目链接:买票问题 思路:优先队列维护忍耐度最低的人在队首,leave操作ok. vis数组记录从1到n的编号的人们是不是在队列中,top维护队首的人的编号.pop操作搞定. 然后,check操作就是 ...

  8. UVA 11610 Reverse Prime (数论+树状数组+二分,难题)

    参考链接http://blog.csdn.net/acm_cxlove/article/details/8264290http://blog.csdn.net/w00w12l/article/deta ...

  9. [HDOJ4325]Flowers(树状数组 离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 关于离散化的简介:http://blog.csdn.net/gokou_ruri/article ...

随机推荐

  1. 支付宝 iOS SDK 官方下载页面[转]

    from:http://blog.sina.com.cn/s/blog_6f72ff900102v0sw.html 藏得太深了,不得不记下来!     官方页面地址:   https://b.alip ...

  2. iOS隐藏导航条1px的底部横线

    第二种方法:1)声明UIImageView变量,存储底部横线 @implementation MyViewController { UIImageView *navBarHairlineImageVi ...

  3. Image 和byte[]之间的转换

    1.Image 转 byte[] public byte[] GetByteByImage(Image image) { byte[] bt = null; try { if (!image.Equa ...

  4. [label][Chrome-Extension] How to start Chrome Extension's development

    Firstly , you should read these two pages.  https://developer.chrome.com/extensions/overview https:/ ...

  5. python3.7使用models.ForeignKey时一定要传入实参on_delete=models.CASCADE

    models.ForeignKey 模型中最重要的部分——以及模型中唯一需要的部分——是它定义的数据库字段列表.字段由类属性指定.注意不要选择与模型API冲突的字段名称,如清除.保存或删除. from ...

  6. WPF显示Gif动画

    WPF的Image控件不能很好的支持.gif文件.解决办法有如下2种. 1使用MediaElement <MediaElement Source="file://D:\anim.gif ...

  7. 「HEOI2014」南园满地堆轻絮

    题目链接 戳我 题目出处 菩萨蛮·南园满地堆轻絮                                             温庭筠 南园满地堆轻絮,愁闻一霎清明雨.雨后却斜阳,杏花零落香 ...

  8. 列表和range、元组

    1.listt.append()默认追加在后面 2.list.insert(索引,“元素”)按索引添加 3.list.extend()可添加多个字或字母的字符串,也可以是列表 4.list.pop() ...

  9. iOS仿UC浏览器顶部频道滚动效果

    很喜欢用UC浏览器上网,当然不是给UC打广告,里面有很多酷炫的效果,值的学习,这次分享的是频道滚动的效果.动画效果如下: 实现的这个效果的关键是绘制,重写顶部Label的drawRect方法 gith ...

  10. djngo 1.9版本以后 Foreignkey() 字段 第二个参数 on_delete 必不可少, mysql 外键可以为空

    一.外键的删除 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 """ ...