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這個屬性,否則你會很傷心。
Spring MVC+Spring3+Hibernate4開發環境搭建 http://www.linuxidc.com/Linux/2013-07/87119.htm
Spring MVC整合Freemarker基於注解方式 http://www.linuxidc.com/Linux/2013-02/79660.htm
基於注解的Spring MVC簡單介紹 http://www.linuxidc.com/Linux/2012-02/54896.htm
Spring MVC 框架搭建及詳解 http://www.linuxidc.com/Linux/2012-01/52740.htm