下图为一个普通的树形菜单,这里有几个概念需要提前说明:

1、对于树形菜单中的某一个菜单而言,都是有子节点与父节点的,根节点与无子节点的菜单除外

2、一个父节点是可以有多个子节点的,而一个子节点只能对应有一个父节点


下面直接上代码:

数据库脚本:

– 建表代码

create table t_hibernate_sys_tree_node
(tree_node_id int primary key auto_increment,                                                 -- IDtree_node_name varchar(50) not null,                                                         -- 名字tree_node_type int not null check(tree_node_type = 1 or tree_node_type = 2),                 -- 节点类型:1 枝节点 2 叶节点position int,                                                                             -- 位置parent_node_id int,                                                                         -- 父节点IDurl varchar(1024),                                                                           -- URLforeign key(parent_node_id) references t_hibernate_sys_tree_node(tree_node_id)
);

– 插入数据的代码

insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(1,'系统管理',1, 1,null,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(2,'市场管理',1, 2,null,null);insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(3,'字典管理',2, 3,1,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(4,'用户管理',2, 4,1,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(5,'角色管理',2, 5,1,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(6,'权限管理',1, 6,1,null);insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(7,'进货管理',2, 7,2,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(8,'销售管理',2, 8,2,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(9,'库存管理',2, 9,2,null);insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(10,'用户分配角色',2, 10,6,null);
insert into t_hibernate_sys_tree_node(tree_node_id, tree_node_name, tree_node_type, position, parent_node_id, url)values(11,'角色授予用户',2, 11,6,null);

实体类:

package com.hibernate.entity;import java.util.HashSet;
import java.util.Set;public class TreeNode {private Integer tree_node_id;private String tree_node_name;private Integer tree_node_type;private Integer position;private Integer parent_node_id;private String url;private TreeNode parent;    //父节点private Set<TreeNode> children=new HashSet<>();    //子节点public Set<TreeNode> getTreeNodes() {return children;}public void setTreeNodes(Set<TreeNode> children) {this.children= children;}public TreeNode getTreeNode() {return parent;}public void setTreeNode(TreeNode parent) {this.parent= parent;}public Integer getTree_node_id() {return tree_node_id;}public void setTree_node_id(Integer tree_node_id) {this.tree_node_id = tree_node_id;}public String getTree_node_name() {return tree_node_name;}public void setTree_node_name(String tree_node_name) {this.tree_node_name = tree_node_name;}public Integer getTree_node_type() {return tree_node_type;}public void setTree_node_type(Integer tree_node_type) {this.tree_node_type = tree_node_type;}public Integer getPosition() {return position;}public void setPosition(Integer position) {this.position = position;}public Integer getParent_node_id() {return parent_node_id;}public void setParent_node_id(Integer parent_node_id) {this.parent_node_id = parent_node_id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Overridepublic String toString() {return "TreeNode [tree_node_id=" + tree_node_id + ", tree_node_name=" + tree_node_name + ", tree_node_type="+ tree_node_type + ", position=" + position + ", parent_node_id=" + parent_node_id + ", url=" + url+ "]";}
}

新建一个xml文件,配置TreeNode实体的映射:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.hibernate.entity.TreeNode" table="t_hibernate_sys_tree_node"><id name="tree_node_id" type="java.lang.Integer" column="tree_node_id"><generator class="increment"></generator></id><property name="tree_node_name" type="java.lang.String" column="tree_node_name"></property><property name="tree_node_type" type="java.lang.Integer" column="tree_node_type"></property><property name="position" type="java.lang.Integer" column="position"></property><property name="parent_node_id" type="java.lang.Integer" column="parent_node_id"></property><property name="url" type="java.lang.String" column="url"></property><!-- 当前节点与父节点是多对一的关系 , name为父节点的属性名,class为属性的全限定名 , column为对应的数据库中的外键的列名(由于这里是自关联,所以为与父节点有关联的列) -->
<!-- 当column中的名字与实体映射文件中的其他的标签的column有相同的时,则需要在其中一方加入insert="false" update="false" ,否则会报错  --><many-to-one name="parent" class="com.hibernate.entity.TreeNode" column="parent_node_id" insert="false" update="false"></many-to-one><!-- 当前节点与子节点是一对多的关系 , name为子节点的属性名 --><set name="children"><!-- column为与子节点有关联的列 --><key column="parent_node_id"></key><!-- 子节点的数据类型的全限定名 --><one-to-many class="com.hibernate.entity.TreeNode"></one-to-many></set></class>
</hibernate-mapping>

将实体的映射文件映射到hibernate的核心配置文件中去:
(核心配置文件也是新建的xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><!-- 配置数据源信息 --><property name="connection.username">root</property><property name="connection.password">123</property>   <property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 配置sql语句生成的规则,配置数据库方言 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 配置本地事务 --><property name="hibernate.current_session_context_class">thread</property><!-- 配置开发调试所用的配置show_sql,format_sql --><property name="show_sql">true</property><property name="format_sql">true</property><!-- 配置映射文件 --><mapping resource="com/hibernate/entity/TreeNode.hbm.xml"/></session-factory>
</hibernate-configuration>

注:HibernateUtils,java 工具类在我之前写的博客中有代码,这里就不贴了:

hibernate中一对多双向关联的记录

编写dao方法:

package com.hibernate.dao;import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;import com.hibernate.entity.TreeNode;
import com.hibernate.util.HibernateUtils;public class TreeNodeDao {public TreeNode get(TreeNode treeNode) {//HibernateUtils为自己写的工具类Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();TreeNode tree = session.get(TreeNode.class, treeNode.getTree_node_id());/**    由于hibernate采用的是懒加载,下面三行代码是将哪些内容设置为立即加载*/Hibernate.initialize(tree);Hibernate.initialize(tree.getTreeNode());Hibernate.initialize(tree.getTreeNodes());beginTransaction.commit();session.close();return tree;}
}

使用junti或者main方法测试代码:

package com.hibernate.dao;import static org.junit.Assert.*;import org.junit.After;
import org.junit.Before;
import org.junit.Test;import com.hibernate.entity.TreeNode;public class TreeNodeDaoTest {private TreeNodeDao treeNodeDao=new TreeNodeDao();@Testpublic void testGet() {TreeNode treeNode=new TreeNode();treeNode.setTree_node_id(6);TreeNode node = treeNodeDao.get(treeNode);System.out.println(node.getTreeNode().getTree_node_id()+" , "+node.getTreeNode().getTree_node_name());System.out.println(node.getTree_node_id()+" , "+node.getTree_node_name());System.out.println(node.getTreeNodes().size());}}

打印结果:

hibernate一对多自关联的记录(以树形菜单为例)相关推荐

  1. Hibernate一对多单向关联和双向关联映射方法及其优缺点

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同. 它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的 ...

  2. hibernate 一对多(one-to-many)双向关联

    一对多(one-to-many)双向关联实例(Department- Employee) 这里的一对多双向关联是在域模型(实体对象模型)上的概念,在关系数据库中,只存在外键参照关系,而且总是由&quo ...

  3. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  4. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  5. hibernate的一对多双向关联映射----客户和订单关系

    客户和订单关系:客户是一的一方,订单是多的一方. customer表: CREATE TABLE `customer` ( `ID` int(4) NOT NULL AUTO_INCREMENT , ...

  6. hibernate一对多关联映射

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  7. hibernate的映射之二(一对多双向关联)

    hibernate的一对多双关联 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 hihernate一对多关联映射(双向Dept<----->Emp) 一对多双 ...

  8. Hibernate检索策略之5.4一对多单向关联检索策略——Hibernate4究竟怎么玩

    今天开始讲一对多单向关联. 转载于:https://www.cnblogs.com/geyifan/archive/2012/09/13/2682669.html

  9. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    视频地址:http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实 ...

最新文章

  1. 解析html语言的软件,小程序解析html标签 div-Go语言中文社区
  2. Windows异常学习笔记(五)—— 未处理异常
  3. javascript 高级程序设计学习笔记(面向对象的程序设计) 1
  4. python文件管理_超值的Python文件操作与管理!
  5. java 除法向上,向下取整
  6. OpenCV-利用其它widthStep方法把interest——img的所有像素值增加200
  7. 计算机窗体视频教程,计算机二级Access2010视频教程
  8. c语言航空订票系统程序设计,C语言航空订票系统
  9. 概率论 方差公式_概率论复习:重要概念和公式
  10. EOF是什么意思以及怎么输入
  11. 衣带渐宽终不悔,为“指针”消得人憔悴(一)
  12. 巨头秀区块链肌肉 原生军机会何在?
  13. JavaScript实现网页轮播图
  14. ADFS 概念与基本开发介绍 (1)
  15. 代码工程 /Qt /5.9.3源码编译
  16. Open vSwitch概述
  17. Settings.settings文件的用处
  18. 学生台灯色温多少合适?2022双十一性价比最高的护眼台灯推荐
  19. 经营一个站群,该如何控制成本呢?【关于域名,空间】
  20. Kubernetes 学习总结(34)—— 如何理解编排

热门文章

  1. 之前项目从未写过的PO2VO
  2. php redis 日志模式,Redis的PHP客户端
  3. react实现浏览器自动刷新_react调用什么刷新页面
  4. od怎么解java打包的exe_关于打包java文件并生成可执行文件的问题
  5. 服务器日志监控系统怎么解决,服务器日志监控系统
  6. 苹果叶片病害识别中的深度学习研究
  7. 渲染怎么加hdri_关于渲染参数设置,伽马2.2你想要知道的一切!
  8. 教你快速运行谷歌EfficientDet目标检测
  9. Python如何从社交用户信息中寻找潜在客户?
  10. python全局变量可以改变吗_在Python中避免我的全局变量,我有几个函数可以改变一个变量...