Spring MVC的优势我就不多说了,在使用Spring MVC的时候要比Struts2舒服多了,至于持久层也还是比较倾向于Hibernate,于是开始试着用Spring+hibernate搭一个简易的权限控制系统(前端用的jQuery-easyUI)。
背景交代完毕,开始说需求:在新增用户的时候需要给用户绑定一个组织机构,一个或者多个角色,在设计User这个Bean的时候自然就是:
public class User{ private int id; private String name; private String account; private String password; private int age; private Date createDate; private Gender sex; private Set<Role> roles; private Enable enable; private Organization organization; }
为了解决这个问题,找了几个别人写的小Demo,其中有个别网友还上传了可能是他们公司正在用的系统,可是在阅读代码的时候发现他们都喜欢用同一种我并不怎么喜欢的方法:定义两个Bean,一个用来接收前台数据,一个用来与后台存储关联hibernate。也就是说,一个User类变成了前面我所写的用来关联后台存储,还有一个新的User类:
public class User{ private int id; private String name; private String account; private String password; private int age; private Date createDate; private Gender sex; private String roles; private Enable enable; private Stringorganization; }
于是问题回来了框架的选择必须得是Spring+Hibernate,那么久必须解决这个传值的问题,当时差点被采纳的方案是将organization和roles单独做两个字段重新传值,然后后台在接收到之后自行处理,并给User赋值,这个方法确实可以偷不少的懒,已经基本够用了,可是这样一来代码就变得很是别扭,明明一个Form里面的字段,非要拆成多个字段来接收,没办法,还是不能忍(请原谅我的瞎折腾)。
到这里差不多把我的思路经历讲的差不多了,当然我只挑了一部分说出来,其他无厘头的想法就不提了,该说出最后的解决方法了,当然如果看完前面那些思路的人再来看解决方案肯定会喷我。。。
解决方法就是:给Role和Organization这两个类加一个只带ID一个参数的构造器(没试过全参构造器,谁试完可以告知一声,我已经懒得试了),然后问题就OK了,解决了。。当然需要注意的一点是不论是Role还是Organization都不要给CascadeType加上update这个属性,否则你会很伤心。。。