本人几乎没写过博客,感觉要学的知识和要做的事情太多,没时间。但发现用博客记录自己学习心得非常好,就抽时间写点,供自己以后参考也分享给某些需要的人,我水平有限,请多指教!
最近在独自尝试开发一个小型的oa系统以巩固下自己对java ssh框架的学习。这里记录下开发中的一些心得体会。
我把系统菜单设计成树,用一张表存储,各个菜单项之间是父子关系,当我们要根据用户权限去数据库中取菜单项时,发现sql语句不好解决。之前在网上查看了一些帖子博文,发现oracle中有对这个需求有专门的sql语句:类似这样
select * from pub_entity a start with a.entity_id = 88 connect by prior a.entity_id = a.super_entity_id;
但我使用的mysql没有,一些文章中说用mysql的存储过程解决,我这个刚出道的菜鸟感觉太复杂了,没去尝试。最后想到可以直接用递归算法解决:
菜单表:
实体类代码:
1 packagecom.xuwei.oa.entity;2
3 importjava.io.Serializable;4 importjava.util.Set;5
6 importjavax.persistence.Column;7 importjavax.persistence.Entity;8 importjavax.persistence.GeneratedValue;9 importjavax.persistence.GenerationType;10 importjavax.persistence.Id;11 importjavax.persistence.ManyToMany;12 importjavax.persistence.Table;13
14 importorg.apache.struts2.json.annotations.JSON;15 importorg.hibernate.annotations.GenericGenerator;16
17 /**
18 * 菜单管理实体类19 *@authorDavid20 *21 */
22 @Entity23 @Table(name="t_menu")24 public class Menu implementsSerializable{25 @Id //设置主键生成策略为手动分配
26 @GenericGenerator(name="menuGenerator",strategy="assigned")27 @GeneratedValue(generator="menuGenerator")28 private Long mid;//主键
29 @Column(name = "name", length = 15)30 private String name;//树上的节点的名称
31 @Column(name = "isParent")32 private Boolean isParent;//是否为文件夹节点
33 @Column(name = "icon", length = 100)34 private String icon;//图标图片的路径
35 @Column(name = "checked", length = 5)36 privateBoolean checked;37 @Column(name = "url", length = 60)38 private String url;//单击菜单跳转的action
39 @Column(name = "target", length = 15)40 private String target;//页面显示位置
41 @Column(name = "pid", length = 5)42 private Long pid;//父节点ID
43
44 publicLong getMid() {45 returnmid;46 }47 public voidsetMid(Long mid) {48 this.mid =mid;49 }50 publicLong getPid() {51 returnpid;52 }53 public voidsetPid(Long pid) {54 this.pid =pid;55 }56 publicString getName() {57 returnname;58 }59 public voidsetName(String name) {60 this.name =name;61 }62 publicBoolean getIsParent() {63 returnisParent;64 }65 public voidsetIsParent(Boolean isParent) {66 this.isParent =isParent;67 }68 publicString getIcon() {69 returnicon;70 }71 public voidsetIcon(String icon) {72 this.icon =icon;73 }74 publicBoolean getChecked() {75 returnchecked;76 }77 public voidsetChecked(Boolean checked) {78 this.checked =checked;79 }80 publicString getUrl() {81 returnurl;82 }83 public voidsetUrl(String url) {84 this.url =url;85 }86 publicString getTarget() {87 returntarget;88 }89 public voidsetTarget(String target) {90 this.target =target;91 }92
93 @ManyToMany(mappedBy = "menus")94 private Set users;//角色set集合
95 @JSON(serialize=false)96 public SetgetUsers() {97 returnusers;98 }99 public void setUsers(Setusers) {100 this.users =users;101 }102
103
104 }
单元测试代码:
1 privateSession session;2 private List
4
5 @Test6 public voidtestQueryAllTreeNodesByRootPid(){7 List
10 vistTreeNodesByPid(6L,res);11 for(Menu m:res){12 System.out.println("*****"+m.getName());13 }14 session.getTransaction().commit();15 }16
17 public void vistTreeNodesByPid(Long pid,List
19 String hql="from Menu m inner join fetch m.users u where m.pid=? and u.uid=? order by m.mid";20 Query query=session.createQuery(hql);21 query.setLong(0, pid);22 query.setLong(1, 16L);23 List
27 res.add(m);28 }29 for(Menu m:list){30 Long tmp_pid=m.getMid();31 if(tmp_pid!=null){32 vistTreeNodesByPid(tmp_pid,res);33 }34 }35 }
这样就轻松解决了这个问题。
原文:http://www.cnblogs.com/davidxu/p/4265994.html