hibernate树状映射
例如公司的组织机构:一个公司可以有多个子公司,一个子公司子有多个部门。
其实就是一张表,
例子程序:
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树状映射的更多相关文章
- hibernate —— 树状存储
package com.pt.treeStrut; import java.util.Set; import javax.persistence.CascadeType; import javax.p ...
- Hibernate:组合模式解决树的映射
树经常用来展示目录结构,那么在Hibernate中怎样解决树的映射问题呢? 先来看一个分销商的树形结构的例子 所有分销商 东北区 辽宁省 沈阳医药 吉林省 华北区 北京市 北京医药 河北省 华南区 那 ...
- Hibernate 再接触 树状结构设计以及学生课程成绩表的设计
1 树状结构的设计 package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax. ...
- UVA 1513 Movie collection (树状数组+反向存储)
题意:给你n盘歌碟按照(1....n)从上到下放,接着m个询问,每一次拿出x碟,输出x上方有多少碟并将此碟放到开头 直接想其实就是一线段的区间更新,单点求值,但是根据题意我们可以这样想 首先我们倒着存 ...
- 线段树或树状数组---Flowers
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=4325 Description As is known to all, the blooming tim ...
- 洛谷 P1908 逆序对 Label:归并排序||树状数组 不懂
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- FZU 2029 买票问题 树状数组+STL
题目链接:买票问题 思路:优先队列维护忍耐度最低的人在队首,leave操作ok. vis数组记录从1到n的编号的人们是不是在队列中,top维护队首的人的编号.pop操作搞定. 然后,check操作就是 ...
- UVA 11610 Reverse Prime (数论+树状数组+二分,难题)
参考链接http://blog.csdn.net/acm_cxlove/article/details/8264290http://blog.csdn.net/w00w12l/article/deta ...
- [HDOJ4325]Flowers(树状数组 离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 关于离散化的简介:http://blog.csdn.net/gokou_ruri/article ...
随机推荐
- swift -懒加载创建view
// 只有外界访问到headerView的时候才会去执行闭包, 然后将闭包的返回值赋值给headerView // 注意: 一定要记住闭包后面需要写上(), 代表执行闭包 //懒加载 ...
- [label][responsive-web-design]网页响应测试各种尺寸的工具
因为现在各种各样的尺寸上网设备 ,所以我们现在的网页设计都必须要兼容到各种尺寸的屏幕,必须测试各个 size下面的页面布局与排版. 一个开发人员是不可能拥有各种设备来进行测试,那么有没有什么便捷的工具 ...
- task3:词频统计
相关的类: java.util.regex.Pattern static Pattern compile(String regex) //编译模式 static Pattern compile(Str ...
- [C#]创建Windows用户及组
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- J-Link eclipse Plug-ins install
Quicklinks If you know what this is all about and you just need the update site details: name: GNU A ...
- XML--修改XML数据
DECLARE @xmlDoc XMLset @xmlDoc='<root> <book id="0001"> <title>C# Progra ...
- 修改mysql的时间/时区
# 背景 往db中insert数据发现时间不对,因为是新DB,所以猜测是mysql设置不对 # 解决方法 方法一:通过mysql命令行模式下动态修改 show variables like " ...
- spring boot maven多模块打包部署到tomcat
@SpringBootApplication(scanBasePackages = {"com.xxx.*"}) public class ApiApplication exten ...
- C#实现AStar寻路算法
AStar寻路算法是一种在一个静态路网中寻找最短路径的算法,也是在游戏开发中最常用到的寻路算法之一:最近刚好需要用到寻路算法,因此把自己的实现过程记录下来. 先直接上可视化之后的效果图,图中黑色方格代 ...
- Wannafly挑战赛29题解
这套题目非常有意思啊23333--话说为啥没有上条先生的呢-- 传送门 \(A\) 御坂美琴 蠢了--首先先判总共加起来等不等于\(n\),不是的话就不行 然后dfs记录\(n\)不断分下去能分成哪些 ...