Hibernate父子Tree
有一次要做一个行业分类的菜单,获取级联关系,由于是个新手,没有这方便的经验,做了很久才整出来一个蹩脚的方法,下面展示一下:
数据库:
CREATE?TABLE?`enterprise_type`?(
??`c_id`?int(11)?NOT?NULL?auto_increment?COMMENT?'企业类型编号',
??`c_name`?varchar(100)?NOT?NULL?COMMENT?'企业类型名称',
??`c_parentid`?int(11)?default?NULL?COMMENT?'父类型编号',
??PRIMARY?KEY??(`c_id`),
??KEY?`FK_enterprise_type`?(`c_parentid`)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8
?
用Myeclipse的工具生成的实体类为:
?
private List<Integer> getCidList(Integer catId, boolean includeSelf) { List<Integer> ret = new ArrayList<Integer>(); List<Integer> list = getSubCatList(catId); ret.addAll(list); if (!includeSelf) ret.remove(catId); return ret; } /** * 指定分类ID的所有子节点 * * @param catId * @return */ private List<Integer> getSubCatList(Integer catId) { List<EnterpriseCategory> allCats = enterpriseCategoryDao.loadAll(); return getSubCatList(catId, allCats); } private List<Integer> getSubCatList(Integer cid, List<EnterpriseCategory> allCats) { Map<Integer, List<Integer>> FK_Parent_Child = new HashMap<Integer, List<Integer>>(); for (EnterpriseCategory cat : allCats) { // 建立所有带有子节点的节点对应关系 List<Integer> list = FK_Parent_Child.get(cat.getParentId()); if (list == null) { list = new ArrayList<Integer>(); list.add(cat.getCId()); FK_Parent_Child.put(cat.getParentId(), list); } else { list.add(cat.getCId()); } } return getSubCats(cid, FK_Parent_Child); } private List<Integer> getSubCats(Integer cid, Map<Integer, List<Integer>> FK_Parent_Child) { List<Integer> nodes = new ArrayList<Integer>(); if (FK_Parent_Child.containsKey(cid)) { // 非叶子节点 nodes.add(cid); List<Integer> childNodes = FK_Parent_Child.get(cid); for (Integer childId : childNodes) { nodes.addAll(getSubCats(childId, FK_Parent_Child)); } } else { // 叶子节点 nodes.add(cid); } return nodes; }?
可以根据指定的ID获取下面的所有的子节点的id。
记下来,说不定以后会用到。虽然自己写的不怎么的,单也是辛苦的成果,记下来
?
?
?
?
?