关于查询权限菜单的加载一般有两种方法:
1,直接查询出全部的菜单加载到浏览器页面
2,类似于Hibernate中的懒加载,第一次加载一级节点与二级节点,
当点击二级节点再去后台查询三级节点用于浏览器的展示
- 实体类
package com.more.entity;
import java.util.ArrayList;
import java.util.List;
public class TreeNode {
private Integer TreeNodeId; //权限id
private String TreeNodeName; //权限名
private Integer TreeNodeType;
private Integer position;
private Integer parentNodeId; //它的父权限Id
private String url;
//一个儿子一个父亲
private TreeNode treeNode;
//一个父亲多个儿子
private List<TreeNode> treeNodes=new ArrayList<>();
//强制加载
private Integer initTreeNode;
public Integer getTreeNodeId() {
return TreeNodeId;
}
public void setTreeNodeId(Integer treeNodeId) {
TreeNodeId = treeNodeId;
}
public String getTreeNodeName() {
return TreeNodeName;
}
public void setTreeNodeName(String treeNodeName) {
TreeNodeName = treeNodeName;
}
public Integer getTreeNodeType() {
return TreeNodeType;
}
public void setTreeNodeType(Integer treeNodeType) {
TreeNodeType = treeNodeType;
}
public Integer getPosition() {
return position;
}
public void setPosition(Integer position) {
this.position = position;
}
public Integer getParentNodeId() {
return parentNodeId;
}
public void setParentNodeId(Integer parentNodeId) {
this.parentNodeId = parentNodeId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public TreeNode getTreeNode() {
return treeNode;
}
public void setTreeNode(TreeNode treeNode) {
this.treeNode = treeNode;
}
public List<TreeNode> getTreeNodes() {
return treeNodes;
}
public void setTreeNodes(List<TreeNode> treeNodes) {
this.treeNodes = treeNodes;
}
public Integer getInitTreeNode() {
return initTreeNode;
}
public void setInitTreeNode(Integer initTreeNode) {
this.initTreeNode = initTreeNode;
}
@Override
public String toString() {
return "TreeNode [TreeNodeId=" + TreeNodeId + ", TreeNodeName=" + TreeNodeName + ", TreeNodeType="
+ TreeNodeType + ", position=" + position + ", parentNodeId=" + parentNodeId + ", url=" + url
+ ", treeNodes=" + treeNodes + "]";
}
}
- 实体类的映射文件
<?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>
<!-- table: 数据库表 name : 数据库表对应的实体类的全限定名 -->
<class name="com.more.entity.TreeNode" table="t_hibernate_sys_tree_node">
<id name="TreeNodeId" type="java.lang.Integer" column="tree_node_id">
<generator class="increment"></generator>
</id>
<property name="TreeNodeName" type="java.lang.String" column="tree_node_name"/>
<property name="TreeNodeType" type="java.lang.Integer" column="tree_node_type"/>
<property name="position" type="java.lang.Integer" column="position"/>
<property name="parentNodeId" type="java.lang.Integer" column="parent_node_id"/>
<property name="url" type="java.lang.String" column="url"/>
<!-- 重复映射错误解决 insert="false" update="false" -->
<many-to-one name="treeNode" class="com.more.entity.TreeNode" column="parent_node_id" insert="false" update="false"/>
<bag order-by="position" name="treeNodes" cascade="save-update" inverse="true">
<!-- 配置外键关键字段 -->
<key column="parent_node_id"/>
<!-- 配置外键关联的表 -->
<one-to-many class="com.more.entity.TreeNode"/>
</bag>
</class>
</hibernate-mapping>
- 查询方法
package com.more.dao;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import com.more.entity.TreeNode;
import com.strurts.utli.HibernateUtils;
public class TreeNodeDao {
/**
* 查询节点
* @param treeNode
* @return
*/
public TreeNode getTreeNode(TreeNode treeNode) {
Session session = HibernateUtils.openSession();
TreeNode nd = session.get(TreeNode.class, treeNode.getTreeNodeId());
if(nd!=null&& new Integer(1).equals(treeNode.getInitTreeNode())) {
Hibernate.initialize(nd.getTreeNodes());
}
//调用提交事务,关闭session的方法
HibernateUtils.closesessionn();
return nd;
}
}
- 测试
public class TreeNodeDaoTest {
private TreeNodeDao dao=new TreeNodeDao();
@Test
public void testGetTreeNode() {
TreeNode treeNode=new TreeNode();
treeNode.setTreeNodeId(1); //节点Id
treeNode.setInitTreeNode(1); //设置立即加载
TreeNode nd = this.dao.getTreeNode(treeNode);
for(TreeNode n:nd.getTreeNodes()) {
System.out.println(n.getTreeNodeName());
}
System.out.println(nd);
}
}
- 结果
字典管理
用户管理
角色管理
权限管理
TreeNode [TreeNodeId=1, TreeNodeName=系统管理, TreeNodeType=1, position=1, parentNodeId=null, url=null, treeNodes=[TreeNode [TreeNodeId=3, TreeNodeName=字典管理, TreeNodeType=2, position=3, parentNodeId=1, url=null, treeNodes=[]], TreeNode [TreeNodeId=4, TreeNodeName=用户管理, TreeNodeType=2, position=4, parentNodeId=1, url=null, treeNodes=[]], TreeNode [TreeNodeId=5, TreeNodeName=角色管理, TreeNodeType=2, position=5, parentNodeId=1, url=null, treeNodes=[]], TreeNode [TreeNodeId=6, TreeNodeName=权限管理, TreeNodeType=1, position=6, parentNodeId=1, url=null, treeNodes=[TreeNode [TreeNodeId=10, TreeNodeName=用户分配角色, TreeNodeType=2, position=10, parentNodeId=6, url=null, treeNodes=[]], TreeNode [TreeNodeId=11, TreeNodeName=角色授予用户, TreeNodeType=2, position=11, parentNodeId=6, url=null, treeNodes=[]]]]]]
附: 数据库表
-- 一对多双向自关联
-- 菜单表
-- t_hibernate_sys_tree_node
-- t:表
-- sys:模块名缩写(system)
-- tree_noe:表名
create table t_hibernate_sys_tree_node
(
tree_node_id int primary key auto_increment, -- ID
tree_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, -- 父节点ID
url varchar(1024), -- URL
foreign key(parent_node_id) references t_hibernate_sys_tree_node(tree_node_id)
);
-- drop table t_hibernate_sys_tree_node
-- select * from t_hibernate_sys_tree_node
select * from t_hibernate_sys_tree_node;
truncate table t_hibernate_sys_tree_node;
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);