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;
}
可是页面在传值的时候一般在传递Organization这个值的时候一般都是传递ID过来,而roles也一般是传递多个ID值到后台,那么自然数据转换就成了一个大问题!(表现在页面上便是400. .....没耐心看吐槽的童鞋请直接跳到最后一段。。
为了解决这个问题,找了几个别人写的小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;
}
然后再在存储之前将两个类相互转换一下,且不说这种方法是否可行,但是我是个懒人,如果要我每个涉及到关联表的地方都像这样写两个类,然后再增加转换方法我宁愿放弃这个框架。事实上我也确实有考虑过其他框架,比如mybatis,但是了解了一下Mybatis这个框架之后发现Hibernate对于我来说有个致命的诱惑:BaseDao<T>的写法。用Mybatis也许可以传值的问题,但是一想到要每个Bean都写一个Dao类,还是果断放弃!至少在没有更多需求之前,还不打算更换Hibernate。
于是问题回来了框架的选择必须得是Spring+Hibernate,那么久必须解决这个传值的问题,当时差点被采纳的方案是将organization和roles单独做两个字段重新传值,然后后台在接收到之后自行处理,并给User赋值,这个方法确实可以偷不少的懒,已经基本够用了,可是这样一来代码就变得很是别扭,明明一个Form里面的字段,非要拆成多个字段来接收,没办法,还是不能忍(请原谅我的瞎折腾)。
到这里差不多把我的思路经历讲的差不多了,当然我只挑了一部分说出来,其他无厘头的想法就不提了,该说出最后的解决方法了,当然如果看完前面那些思路的人再来看解决方案肯定会喷我。。。
解决方法就是:给Role和Organization这两个类加一个只带ID一个参数的构造器(没试过全参构造器,谁试完可以告知一声,我已经懒得试了),然后问题就OK了,解决了。。当然需要注意的一点是不论是Role还是Organization都不要给CascadeType加上update这个属性,否则你会很伤心。