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 ...
随机推荐
- 支付宝 iOS SDK 官方下载页面[转]
from:http://blog.sina.com.cn/s/blog_6f72ff900102v0sw.html 藏得太深了,不得不记下来! 官方页面地址: https://b.alip ...
- iOS隐藏导航条1px的底部横线
第二种方法:1)声明UIImageView变量,存储底部横线 @implementation MyViewController { UIImageView *navBarHairlineImageVi ...
- Image 和byte[]之间的转换
1.Image 转 byte[] public byte[] GetByteByImage(Image image) { byte[] bt = null; try { if (!image.Equa ...
- [label][Chrome-Extension] How to start Chrome Extension's development
Firstly , you should read these two pages. https://developer.chrome.com/extensions/overview https:/ ...
- python3.7使用models.ForeignKey时一定要传入实参on_delete=models.CASCADE
models.ForeignKey 模型中最重要的部分——以及模型中唯一需要的部分——是它定义的数据库字段列表.字段由类属性指定.注意不要选择与模型API冲突的字段名称,如清除.保存或删除. from ...
- WPF显示Gif动画
WPF的Image控件不能很好的支持.gif文件.解决办法有如下2种. 1使用MediaElement <MediaElement Source="file://D:\anim.gif ...
- 「HEOI2014」南园满地堆轻絮
题目链接 戳我 题目出处 菩萨蛮·南园满地堆轻絮 温庭筠 南园满地堆轻絮,愁闻一霎清明雨.雨后却斜阳,杏花零落香 ...
- 列表和range、元组
1.listt.append()默认追加在后面 2.list.insert(索引,“元素”)按索引添加 3.list.extend()可添加多个字或字母的字符串,也可以是列表 4.list.pop() ...
- iOS仿UC浏览器顶部频道滚动效果
很喜欢用UC浏览器上网,当然不是给UC打广告,里面有很多酷炫的效果,值的学习,这次分享的是频道滚动的效果.动画效果如下: 实现的这个效果的关键是绘制,重写顶部Label的drawRect方法 gith ...
- djngo 1.9版本以后 Foreignkey() 字段 第二个参数 on_delete 必不可少, mysql 外键可以为空
一.外键的删除 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 """ ...