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

其实就是一张表,

例子程序:

Organization类:

package com.oracle.hibernate;

import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; @Entity
public class Organization { private int id;
private String name;
//父机构
private Organization parent;
//一个父机构可有多个子机构
private Set<Organization> children = new HashSet<Organization>(); @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;
}
/**
* 对于父机构:多对一
* pid是本机构的外键,指向父机构的标识,其实就是指向父机构的id
*/
@ManyToOne
@JoinColumn(name="pid")
public Organization getParent() {
return parent;
}
public void setParent(Organization parent) {
this.parent = parent;
}
/**
* 对于子机构:一对多
*设mappedBy,
*fetch=EAGER可以加载父机构时全部加载子机构。机构树小 时可以用,树大时可用ajax异步
*
*/
@OneToMany(mappedBy="parent",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public Set<Organization> getChildren() {
return children;
} public void setChildren(Set<Organization> children) {
this.children = children;
} }

测试类:

package com.oracle.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass; public class Test { private static SessionFactory sf = null; @BeforeClass
public static void beforeClass() { try {
// 生成表
new SchemaExport(new AnnotationConfiguration().configure()).create(
false, true);
sf = new AnnotationConfiguration().configure()
.buildSessionFactory();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @org.junit.Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(
false, true); } @AfterClass
public static void afterClass() {
sf.close();
} @org.junit.Test
public void testSave() { Session s = sf.getCurrentSession();
s.beginTransaction(); Organization org = new Organization();
org.setName("总公司"); Organization org2 = new Organization();
Organization org3 = new Organization();
Organization org4 = new Organization();
Organization org5 = new Organization();
org2.setName("分公司1");
org3.setName("分公司2");
org4.setName("分公司1_部门1");
org5.setName("分公司1_部门2"); org2.setParent(org);
org3.setParent(org);
org4.setParent(org2);
org5.setParent(org2); org.getChildren().add(org2);
org.getChildren().add(org3);
org.getChildren().add(org4);
org.getChildren().add(org5); s.save(org);
s.getTransaction().commit();
} @org.junit.Test
public void testLoad() {
testSave();// 生成数据
Session s = sf.getCurrentSession();
s.beginTransaction();
Organization org = (Organization) s.load(Organization.class, 1);
print(org, 0);
s.getTransaction().commit(); } // 递归显示目录结构
private void print(Organization org, int level) {// level标识级别
String preStr = "";
for (int i = 0; i < level; i++) {
preStr += "---"; // 级别往下一级,缩进
}
System.out.println(preStr + org.getName()); for (Organization o : org.getChildren()) { print(o, level + 1);
} }
}

生成的表:

打印树状结构:

总公司
---分公司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. 用Word2007写CSDN博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  2. jmeter 使用ANT运行 设置自动停止时间

    1.直接看图

  3. Javascript设计模式理论与实战:简单工厂模式

    通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...

  4. ssl协议,openssl,创建私有CA

    SSL是Security Socket Layer:安全的套接字层 他介于HTTP和TCP协议层之间 SSL是Netscape公司开发的,属于个人 TLS是标准委员会制定的 OpenSSL是SSL的开 ...

  5. 一起学习《C#高级编程》3--运算符重载

    运算符的重载.C++的开发人员应该很熟悉这个概念,但这对Java 和 VB 开发人员确实全新的. 对于一些数值间的运算,如果通过方法来指定运算规则的话,不免会繁琐,这时就可以利用运算符的重载. 例: ...

  6. 解决ie img标签内存泄漏

    代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; ...

  7. bat windows10系统垃圾清理---

    @echo off color 0a title windows10系统垃圾清理--- echo ★☆ ★☆ ★☆ ★☆ ★☆★☆★☆ ★☆ ★☆ ★☆ ★☆★ echo ★☆ ★☆ ★☆ ★☆ ★☆ ...

  8. 【Asp.net MVC】AJAXHelper 和jQueryAjax

    在ASP.NET MVC中,有一个官方提供的AJAXHelper帮助我们做AJAX相关的东西.我用传统的jQuery AJAX技术和AJAXHelper分别实现同一个demo,特此记录一下. 由于是在 ...

  9. linux命令之用户管理及用户信息查询命令(上)

    1.useradd:创建用户 该命令用于创建新的用户或者更改用户的信息. 参数 说明 -g 指定用户对应的用户组,用户组 -s 用户登录后使用的Shell名称 -u 用户的ID值 示例: 1)user ...

  10. jquery改造轮播图1

    g改造轮播图1:https://www.cnblogs.com/huanghuali/p/8677338.html <!DOCTYPE html> <html lang=" ...