Hibernate 的一对多自关联

关于查询权限菜单的加载一般有两种方法
1,直接查询出全部的菜单加载到浏览器页面
2,类似于Hibernate中的懒加载,第一次加载一级节点与二级节点,
当点击二级节点再去后台查询三级节点用于浏览器的展示

  1. 实体类
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 + "]";
	}

}

  1. 实体类的映射文件
<?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>
  1. 查询方法
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;
	}
	
	
	
	
	
	
}

  1. 测试
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);
	}

}

  1. 结果
字典管理
用户管理
角色管理
权限管理
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);

猜你喜欢

转载自blog.csdn.net/zimuliusu/article/details/83446153