2006年7月21日
#
很不錯(cuò)的一個(gè)UML建模工具-argouml
argouml下載地址
我一眼就看上他的原因是:生成的用例和包圖可能直接生成JAVA代碼,而且準(zhǔn)備無誤,這正是我要找的。
我想:以后使用一些框架的話,可能由PD生成一些實(shí)體,然后Hibernate生成pojo等,加入到argouml,然后根據(jù)一個(gè)框架的特性生成一些包
和類.就等于詳細(xì)設(shè)計(jì)了吧.應(yīng)該來說是比詳細(xì)設(shè)計(jì)還實(shí)用的東西.總比哪些WORD文檔好吧.還有讓人看不懂的概要設(shè)計(jì).
我想從技術(shù)出發(fā),這個(gè)是一條比較適用的路子.下班了.我明天將會(huì)匯報(bào)一下我使用的情況和一些范例.
反過來又想像.這好象是一個(gè)組合的腳手架.好象ROR的零星操作步驟.應(yīng)該學(xué)習(xí).ROR畢竟是一個(gè)新生事物,JAVAEYE的推廣也需要一個(gè)時(shí)間.如果像我這樣的打工,混口飯吃的人還是專心的研究J2EE好一點(diǎn).否則明天就沒有飯吃了.
呵呵.我的文章可被JAVAEYE收回到水貼里了,可能自己的能力不如人吧,好好學(xué)習(xí),天天向上,如果看客有什么好的工具和軟件生產(chǎn)思路,可以共同交流。
今天學(xué)習(xí)了一下ROR,有一些學(xué)習(xí)經(jīng)驗(yàn)東西要與大家分享。
給ROR加一個(gè)座右銘--------狹窄心腸的日本產(chǎn)物。
首先,不要一個(gè)一個(gè)的下載Ruby,Rails,建議使用一鍵安裝,下載地址如下:
InstantRails-1.3-win
版本說明:ruby 1.8.4 (2005-12-24) [i386-mswin32]
其次,下載一個(gè)目前為止比較好的一個(gè)ROR的實(shí)踐工具:RadRails
下載地址:radrails-0.7.1-win32
接下來,設(shè)置一下Radrails的環(huán)境
1)、Windows/perferences/Ruby/Installed Inteperters/ ->add ruby所在路徑:比如D:\InstantRails\ruby\bin\ruby.exe
2)、Windows/perferences/Rails/Configuration ->Rails path:比如D:\InstantRails\ruby\bin\rails
->Rake path:比如D:\InstantRails\ruby\bin\rake 絕不是bat/cmd
->mogrel path:比如D:\InstantRails\ruby\bin\mongrel_rails絕不是bat/cmd
有了如上的配置后,就只需要和在JAVA當(dāng)中ANT一樣使用。(成功用過APPFUSE的人就不用害怕了)
看看日本人寫的第一步:
1),在RadRails中創(chuàng)建一個(gè)Rails Project,怎么樣會(huì)出來一堆的東東。
2),進(jìn)入DOS命令吧,后面的工序都是這樣的,好象買了海爾的洗衣機(jī),第一次是送貨、第二次是用戶回訪,第三次是.....
進(jìn)入到你的項(xiàng)目處,運(yùn)行ruby script\generate controller MyTest,
則得到的服務(wù)如下:
exists app/controllers/
exists app/helpers/
create app/views/my_test
exists test/functional/
create app/controllers/my_test_controller.rb
create test/functional/my_test_controller_test.rb
create app/helpers/my_test_helper.rb
修改一下my_test_controller.rb
代碼
??????
class
?MyTestController?
<
?ApplicationController
??????def?index
????????render_text?
"
Hello?world!!
"
??????end?
??????end
在瀏覽器里輸入:http://127.0.0.1:3000/my_test/
會(huì)出現(xiàn) Hello world!!字樣,
不過有意思的是你可以輸入:http://127.0.0.1:3000/My_test/
http://127.0.0.1:3000/My_Test/
http://127.0.0.1:3000/my_Test/
都可以得到這個(gè)值,可能沒有JAVA哪樣嚴(yán)格吧。
3)、還有對(duì)數(shù)據(jù)庫(kù)的操作,要配置一個(gè)database.yml(好象Log4j的東東)
4)、創(chuàng)建數(shù)據(jù)庫(kù)表的時(shí)候只能夠使用復(fù)數(shù)起名,比如User就不行,只能夠起Users
下面只要執(zhí)行幾個(gè)命令就可以使用增刪改查了。
如下是我的操作,下班了,就不多寫了,例子能夠說明一切問題:
代碼
?1?E:\RORProject\demo>ruby?script/generate?model?user
?2?
?3???????exists??app/models/
?4?
?5???????exists??test/unit/
?6?
?7???????exists??test/fixtures/
?8?
?9???????create??app/models/user.rb
10?
11???????create??test/unit/user_test.rb
12?
13???????create??test/fixtures/users.yml
14?
15???????exists??db/migrate
16?
17???????create??db/migrate/001_create_users.rb
18?
19?E:\RORProject\demo>ruby?script/generate?controller?user
20?exists?app/controllers/
21?exists?app/helpers/
22?create?app/views/user
23?exists?test/functional/
24?create?app/controllers/user_controller.rb
25?create?test/functional/user_controller_test.rb
26?create?app/helpers/user_helper.rb
27?
修改user_controller.rb如下:
代碼
1????class?UserController?<?ApplicationController
2????????scaffold:user
3????end
最后你的瀏覽器當(dāng)中輸入:http://127.0.0.1:3000/user/list,就包括了對(duì)數(shù)據(jù)庫(kù)表的四個(gè)操作.當(dāng)然你也可以自己定義四個(gè)操作的任意一種.
最后總結(jié):
ROR可能是敏捷開發(fā)的一個(gè)好實(shí)踐,但是我覺得他完成復(fù)雜應(yīng)用進(jìn)不會(huì)有大做為,而至于這一點(diǎn)還需要再做探究。不過現(xiàn)階段最好的需求就是能夠給用戶快速的寫出一個(gè)不完整的DEMO,這一點(diǎn)為以后打單取得主動(dòng)。
摘要: 只需要你三個(gè)JAVA類和兩個(gè)配置文件,就可以完成你的MVC應(yīng)用,我們就做一個(gè)示例吧。本文以一個(gè)登錄為例。第一個(gè)JAVA文件Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/**======================================...
閱讀全文
在項(xiàng)目開發(fā)的很多時(shí)候,用戶需要更友好,更容易理解的操作界面,而為了能夠達(dá)到這種表現(xiàn)界面,struts標(biāo)簽顯得力不從心,本人經(jīng)過幾個(gè)項(xiàng)目的開發(fā)當(dāng)中 逐漸的擯棄了struts標(biāo)簽,而由JSTL來做為JSP頁(yè)面的表達(dá)者。
struts標(biāo)簽之死穴一 不支持嵌套
看看這種常見的需求吧。一個(gè)用戶隸屬于一個(gè)職能部門,比如
項(xiàng)目要求 職能部門有五個(gè)(亂寫的)
1、企劃部
2、網(wǎng)絡(luò)集成部
3、行政部
4、營(yíng)銷部
5、產(chǎn)品部
項(xiàng)目要求 一共有二個(gè)員工
1、張三 隸屬于行政部
2、李四 隸屬于營(yíng)銷部
而你想把張三和李四都列表出來,顯示為如下:
姓名 部門名稱
張三 行政部
李四 營(yíng)銷部
而且還需要用戶的列表鏈接到修改頁(yè)面當(dāng)中(假如只修改部門)應(yīng)該如何做呢。
在使用struts標(biāo)簽是很難做到的,除非你非常不在意內(nèi)存的使用(亂寫技術(shù)性代碼)
看看JSTL是如何做的吧。
從STRUTS的ACTION當(dāng)中加載兩個(gè)對(duì)象
List?GetAllDept?
=
?UserDAO.GetAllDept();
//
取得所有部門
List?GetALLUser?
=
?UserDAO.GetAllUser();
//
取得所有用戶
request.setAttribute(
"
View_Dept
"
,?GetAllDept);
request.setAttribute(
"
View_User
"
,?GetALLUser);
在頁(yè)面當(dāng)中加入對(duì)JSTL的引用
<%@?taglib?uri="http://java.sun.com/jsp/jstl/core"?prefix="c"%>
然后寫代碼如下:
<table>
<tr>
<td?align="center">
<a?href="User.do?method=EditUser&UserId=<c:out?value='${View_User.UserId}'/>">
<c:out?value="${View_User.UserName}"?/>?</a>
</td>
<td?align="center">
<c:forEach?items="${View_Dept}"?var="View_Dept">
<c:if?test="${View_User.Dept.DeptId==View_Dept.DeptId}">
<c:out?value="${View_Dept.DeptName}"?/>
</c:if>????????????????????????????
</c:forEach>
</td>
</tr>
</table>
其中View_User.Dept.DeptId表示USER表與DEPT表的一個(gè)關(guān)系(外鍵)
你就可以看到所顯示的列表了。
還有如果在修改用戶時(shí),則也與上面的差不多,首先在ACTION當(dāng)中加入:
String?ModifyUserId?=?request.getParameter("GroupUserId");
if?(ModifyUserId?==?null?&&?ModifyUserId.equals(""))?{
//這是出錯(cuò)處理
request.setAttribute("UserMsg",?"User.ValidateUser");
return?mapping.findForward("Fail");
}
DynaValidatorForm?UserActionForm?=?(DynaValidatorForm)?form;
User?user?=?UserDAO.GetUser(ModifyUserId);????????
List?GetAllDept?=?UserDAO.GetAllDept();//取得所有部門
request.setAttribute("View_Dept",?GetAllDept);
UserActionForm.set("User",?User);
然后頁(yè)面當(dāng)中顯示如下(部門為L(zhǎng)ISTBOX),例子當(dāng)中只顯示部門
<html:select?property="DeptAsString">????????????
<c:forEach?items="${View_Dept}"?var="View_Dept">????????
<c:choose>????????????????????????
<c:when?test="${User.Dept.DeptId==View_Dept.DeptId}">
<option????value="<c:out?value='${View_Dept.DeptId}'?/>"selected>????
<c:out?value="${View_Dept.DeptName}"?/>????????????
</option>????????????????????????????
</c:when>????????????????????????????
<c:otherwise>????????????????????????
<option?value="<c:out?value='${View_Dept.DeptId}'?/>">????????
<c:out?value="${View_Dept.DeptName}"?/></option>????????
</c:otherwise>????????????????????????
</c:choose>
</c:forEach>
</html:select>
可以看到HTML的SELECT有一個(gè)DeptAsString,你可以在FORM當(dāng)中指定一個(gè)STRING的FORM屬性。
這樣用戶的要求就可以完成了。
本次只說明方法,而代碼沒有經(jīng)過測(cè)試。希望大家多多觀注我的BLOG,下一次將臭罵ACTIONFROM不支持的DATE類型及解決方法。
摘要: 在大家的編碼過程當(dāng)中,有沒有遇到過這么一種情況,很多零亂的狀態(tài)、分類和其它常用選項(xiàng)常常是定義死了。但是沒有一個(gè)完整的東東來約束他,在每個(gè)模塊當(dāng)中使用相關(guān)的信息時(shí),往往重新COPY一次,或者COPY過來修改一次。如果多人協(xié)作的話,務(wù)必會(huì)讓代碼變的零亂、不好管理等。
本次主要是把一些靜態(tài)的分類、狀態(tài)或者其它常用選項(xiàng)使用二維數(shù)組管理起來。如果你是一個(gè)使用JSTL或者STRUTS做前臺(tái)表現(xiàn)的話,你就更應(yīng)該好好關(guān)注了.......
閱讀全文
??? 在工作當(dāng)中,遇到了一個(gè)不明智的上級(jí),我是劉羅鍋,但是領(lǐng)導(dǎo)不一定是乾隆。設(shè)計(jì)當(dāng)中的爭(zhēng)執(zhí)成為私下做對(duì)的理由,從此,我感覺到今年的財(cái)運(yùn)不佳。
??? 因?yàn)楣ぷ鳟?dāng)中的爭(zhēng)執(zhí),而讓領(lǐng)導(dǎo)失去了面子??我在郁悶當(dāng)中,為什么呀!好事反而成了壞事。
??? 領(lǐng)導(dǎo)的報(bào)復(fù)心理,讓我失去了績(jī)效,所以我感覺到財(cái)運(yùn)不佳。我很想跳出這個(gè)魔鬼圈,是不是能夠改善一下自己的經(jīng)濟(jì)收入呢?正在想離開這個(gè)公司......
??? 發(fā)現(xiàn)自己的軟肋:UML整體設(shè)計(jì)(最好有代碼生成)和XP敏捷開發(fā)。近期需要加強(qiáng)這兩方面的學(xué)習(xí),可以以權(quán)限設(shè)計(jì)為UML做為訓(xùn)練(生成代碼??),以CRM->VtigerCRM為業(yè)務(wù)主線,做一個(gè)XP開發(fā),不過VtigerCRM的表設(shè)計(jì)真是很糟糕,Indiea人呀。
??? 今年的公司很亂,是一個(gè)很糟糕的管理層,可能我以后離開這個(gè)公司后才感覺到領(lǐng)導(dǎo)者的“聰明才智”吧!完全在內(nèi)耗當(dāng)中生存。我已經(jīng)被領(lǐng)導(dǎo)國(guó)邊緣化,我會(huì)在灰色的區(qū)域彷徨很長(zhǎng)的時(shí)間,或許公司另有高人吧,我已經(jīng)被領(lǐng)導(dǎo)逐漸忽視,自己發(fā)光的時(shí)間也只有一年,好象知了一樣。
??? “人貴有自知之明”,如果領(lǐng)導(dǎo)沒有重視,只是為了發(fā)揮自己的最低性能的話,我完全有很多的時(shí)間來學(xué)習(xí)知識(shí),我很慶幸自己和開源代碼有很大的信心,我將在以后的時(shí)間里,為開源界展示自己的能力。
??? 首先要把自己學(xué)習(xí)到的知識(shí)透明化,其次我會(huì)在開源中小型的CRM軟件當(dāng)中做出自己應(yīng)有的貢獻(xiàn)。
??? struts表單主要是利用actionform來取得JSP頁(yè)面所有的request的,所有的Struts標(biāo)簽無非在取得request當(dāng)中的所有INPUT,并賦值回標(biāo)簽值的,同理,JSTL能夠在JSP表單當(dāng)中輕易的表現(xiàn)要輸出的結(jié)果。
??? 如果你是高手,你就知道這個(gè)標(biāo)題有誤,是的,struts表單與JSTL表現(xiàn)沒有可比性,但是如果我們要在實(shí)現(xiàn)一個(gè)多條件的查詢頁(yè)面時(shí),這個(gè)比較就比較有效了。
??? 我不妨比較一下利用struts表單的查詢實(shí)現(xiàn) 和 利用JSTL做為表現(xiàn)而實(shí)現(xiàn)的查詢功能有什么不同,讓讀者尋其方便。
??? 示例說明:
??? 用戶表-USER
??? username? 用戶名稱
??? loginid?? 登錄ID
??? sex?????? 性別
??? 一、利用struts表單的查詢實(shí)現(xiàn)
??????? 實(shí)現(xiàn)步驟:
??????? 創(chuàng)建多條件的序列化對(duì)象(java)->在struts.config當(dāng)中申明actionform->Action當(dāng)中實(shí)現(xiàn)->輸出結(jié)果
???????
????/**?The?value?of?the?simple?userName?property.?*/
????private?java.lang.String?userName;
????/**?The?value?of?the?simple?loginId?property.?*/
????private?java.lang.String?loginId;
????/**?The?value?of?the?simple?sex?property.?*/
????private?java.lang.String?sex;
????/**
?????*?Return?the?value?of?the?USER_NAME?column.
?????*?@return?java.lang.String
?????*/
????public?java.lang.String?getUserName()
????{
????????return?this.userName;
????}
????/**
?????*?Set?the?value?of?the?USER_NAME?column.
?????*?@param?userName
?????*/
????public?void?setUserName(java.lang.String?userName)
????{
????????this.userName?=?userName;
????/**
?????*?Return?the?value?of?the?LOGIN_ID?column.
?????*?@return?java.lang.String
?????*/
????public?java.lang.String?getLoginId()
????{
????????return?this.loginId;
????}
????/**
?????*?Set?the?value?of?the?LOGIN_ID?column.
?????*?@param?loginId
?????*/
????public?void?setLoginId(java.lang.String?loginId)
????{
????????this.loginId?=?loginId;
????}
????/**
?????*?Return?the?value?of?the?sex?column.
?????*?@return?java.lang.String
?????*/
????public?java.lang.String?getSex()
????{
????????return?this.sex;
????}
????/**
?????*?Set?the?value?of?the?sex?column.
?????*?@param?loginId
?????*/
????public?void?setSex(java.lang.String?sex)
????{
????????this.sex?=?sex;
????}
<!-- struts_fonfig -->
??????? <form-bean?name="UserActionForm"?type="org.apache.struts.validator.DynaValidatorForm">
<form-property?name="userCondition"?type="com.antbee.searchCondition.UserFindCondition"?/>????????
????????</form-bean>
Action當(dāng)中
DynaValidatorForm?UserForm?=?(DynaValidatorForm)?form;
????????UserFindCondition?Condition?=?(UserFindCondition)?UserActionForm
????????????????.get("userCondition");//?取得查詢條件
List?user?=?userManager.find(Condition,
????????????????(iCurPageNo?-?1)?*?pageCon.PAGE_SIZE,?pageCon.PAGE_SIZE);//呵呵,加入了hibernate的分頁(yè)
具體實(shí)現(xiàn):
????public?List?find(UserFindCondition?Condition,?int?begin,
????????????int?count)?{
????????StringBuffer?sql?=?new?StringBuffer("from?User?as?a?where?1=1");??????????????
? ? ? ? if?(Condition?!=?null)?{
????????????makeSql(sql,?shipmentFindCondition);
????????}
????????String?fsql?=?sql.toString();
????????Query?query?=?this.getSession().createQuery(fsql);
????????if?(Condition?!=?null)?{
????????????setParameter(query,?Condition);
????????}
????????query.setFirstResult(begin);
????????query.setMaxResults(count);
????????List?tt?=?query.list();
????????return?tt;
????}
--
??? /**
??? ?* 根據(jù)條件生成一個(gè)sql語(yǔ)句
??? ?*
??? ?* @author 和
??? ?* @param sql
??? ?*??????????? 初始的sql語(yǔ)句(一般為select a from A as a where 1=1)
??? ?* @param condition
??? ?*??????????? 查詢的條件
??? ?* @return
??? ?* @version 1.0
??? ?*/
private?void?makeSql(StringBuffer?sql, UserFindCondition?condition)?{
????????if?(condition.getUsername()?!=?null
????????????????&&?!condition.getUsername().toString().equals(""))?{
????????????sql
????????????????????.append("?and a.username like?:username");
????????}
????????if?(condition.getLoginid()?!=?null
????????????????&&?!condition.getLoginid(().equals(""))?{
????????????sql
????????????????????.append("?and a.loginid( =?:loginid(");
????????}
????????if?(condition.getSex()?!=?null
????????????????&&?!condition.getSex().equals(""))?{
????????????sql.append("?and a.sex =?:sex");
????????}
????}
????/**
?????*?根據(jù)條件設(shè)置query的值
?????*?
?????*?@author?和
?????*?@param?query
?????*????????????一個(gè)hibernate的Query對(duì)象
?????*?@param?condition
?????*????????????查詢的條件
?????*?@return
?????*?@version?1.0
?????*/
????private?void?setParameter(Query?query, UserFindCondition?condition)?{
????????if?(condition.getUsername()?!=?null
????????????????&&?!condition.getUsername().equals(""))?{
????????????query.setString("username",?"%"?+?condition.getUsername()
????????????????????+?"%");
????????}
????????if?(condition.getLoginid()?!=?null
????????????????&&?!condition.getLoginid().equals(""))?{
????????????query.setString("loginid",?condition.getLoginid());
????????}
????????if?(condition.getSex()?!=?null
????????????????&&?!condition.getSex().equals(""))?{
????????????query.setString("sex",?condition.getSex());
????????}?????
????}
呵呵,笑死人了,這個(gè)方法很通用,我才在我的第二個(gè)項(xiàng)目當(dāng)中才用到,真是可惜,當(dāng)然了,使用Actionform有一個(gè)毛病就是對(duì)date類型要轉(zhuǎn)換成STRING類型來處理,這是actionform的一個(gè)死穴。還有對(duì)Actionform不能夠重置,只能夠回來從前。不知道這群設(shè)計(jì)者怎么想的,真是由于這一點(diǎn),所以我們有必要使用最原始的方法來解決問題了。使用頁(yè)面當(dāng)中的input,我們來拼request如何?
?? 二、利用JSTL做為表現(xiàn)而實(shí)現(xiàn)的查詢功能
???? 步驟:在JSP頁(yè)面布置很多的input,當(dāng)然,你可以加入value了。(省略了...)
?????????? 創(chuàng)建查詢條件的序列化對(duì)象(同樣user.java)
?????????? 在action當(dāng)中拼個(gè)condition了,做為查詢條件,后面的處理類同第一種方式。
?????UserSearchCondition?userSearchCondition?=?null;
?????userSearchCondition?=?makeUserSearchCondition(request);
private UserSearchCondition?makeUserSearchCondition(HttpServletRequest?request)?throws?Exception{
??????? UserSearchCondition userSearchCondition?=?new?OrderSearchCondition();
????????String username =?request.getParameter("Username");
????????String loginid =?request.getParameter("Loginid");
????????String sex =?request.getParameter("Sex");??
???????
????????????????
????????if(username!=?null?&&?!username.trim().equals("")){
??????????? usernameSearchCondition.setUsername(username);
????????}
????????
????????if(loginid? !=?null?&&?!loginid.trim().equals("")){
??????????? userSearchCondition.setLoginid (loginid );
????????}
????????
????????if(sex !=?null?&&?!sex.trim().equals("")){????????
??????????? userSearchCondition.setSex(sex);
????????}??????
????????
????????return userSearchCondition;
????}
???? 以后的方法,我就不用再做舉例了吧,可以參考如上第一種方法的實(shí)現(xiàn).
???? 第二種方法的好處就是:在頁(yè)面上比較好控制,比如重置,又比如日期性數(shù)據(jù)等。
???? (所有過程當(dāng)中的代碼沒有經(jīng)過測(cè)試,只是說明這種方法而已)
呵呵,在忙一個(gè)項(xiàng)目,潛水很久,現(xiàn)在冒個(gè)泡:
(本文適用在struts+spring+hibernate3上做開發(fā)的蟲蟲們)
類名:HibernateUtil
package?com.antbee.j2eemodel.util;
import?java.lang.reflect.InvocationTargetException;
import?java.lang.reflect.Method;
import?java.util.Collection;
import?java.util.Iterator;
import?org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public?class?HibernateUtil?extends?HibernateDaoSupport?{
/**
*?初始化POJO類
*?@author?@家軍
*?@param?object?POJO對(duì)象
*?@param?methodName?方法名稱
*?@return
*?@version?1.0
*/
public?void?initialize(Object?object,?String?methodName)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
String[]?methodArray?=?methodName.split("\\.");
Method?method?=?null;
Object?initializeObject?=?object;
if(methodArray.length?==?1){
this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
method?=?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
initializeObject?=?method.invoke(initializeObject,?new?Object[]?{});
this.getHibernateTemplate().initialize(initializeObject);
}else{
for(int?i=0;i<methodArray.length;i++){
method?=?initializeObject.getClass().getMethod(methodArray[i],?new?Class[]?{});
initializeObject?=?method.invoke(initializeObject,?new?Object[]?{});
}
this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(initializeObject);
}
}
/**
*?初始化POJO類
*?@author?@家軍
*?@param?object?POJO對(duì)象
*?@param?methodName?方法名稱數(shù)組
*?@return
*?@version?1.0
*/
public?void?initialize(Object?object,?String?methodName[])
throws?SecurityException,?NoSuchMethodException,
IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
for?(int?i?=?0;?i?<?methodName.length;?i++)?{
String[]?methodArray?=?methodName[i].split("\\.");
Method?method?=?null;
Object?initializeObject?=?object;
if(methodArray.length?==?1){
this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
method?=?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
initializeObject?=?method.invoke(initializeObject,?new?Object[]?{});
this.getHibernateTemplate().initialize(initializeObject);
}else{
for(int?j=0;j<methodArray.length;j++){
method?=?initializeObject.getClass().getMethod(methodArray[j],?new?Class[]?{});
initializeObject?=?method.invoke(initializeObject,?new?Object[]?{});
}
this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(initializeObject);
}
}
}
/**
*?初始化POJO類
*?@author?@家軍
*?@param?object?POJO對(duì)象
*?@return
*?@version?1.0
*/
public?void?initialize(Object?object)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
this.getHibernateTemplate().lock(object,?org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(object);
}
/**
*?初始化POJO類
*?@author?@家軍
*?@param?collection?POJO對(duì)象集合
*?@param?methodName?方法名稱數(shù)組
*?@return
*?@version?1.0
*/
public?void?initialize(Collection?collection,?String?methodName[])
throws?SecurityException,?NoSuchMethodException,
IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
for(Iterator?i=collection.iterator();i.hasNext()Wink{
Object?object?=?i.next();
this.initialize(object,methodName);
}
}
/**
*?初始化POJO類
*?@author?@家軍
*?@param?collection?POJO對(duì)象集合
*?@param?methodName?方法名稱
*?@return
*?@version?1.0
*/
public?void?initialize(Collection?collection,?String?methodName)
throws?SecurityException,?NoSuchMethodException,
IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
for(Iterator?i=collection.iterator();i.hasNext()Wink{
Object?object?=?i.next();
this.initialize(object,methodName);
}
}
}?
這個(gè)方法的好外是:可以不在hbm.xml的文件當(dāng)中,指定為lazy=true這個(gè)模式,可以直接使用。使用方法如下:
如果你使用SPRING,則需要把hibernateUtil注入其中:
?<bean?id="hibernateUtilTarget"?class="com.antbee.j2eemodel.util.HibernateUtil">
<property?name="sessionFactory">
<ref?local="mssqlSessionFactory"?/>
</property>
</bean>
<bean?id="hibernateUtil"?parent="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property?name="target">
<ref?local="hibernateUtilTarget"?/>
</property>
</bean>
<!--配置基礎(chǔ)事務(wù)-->
<bean?id="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?abstract="true">
<property?name="transactionManager">
<ref?bean="mssqltransactionManager"?/>
</property>
<property?name="proxyTargetClass">
<value>true</value>
</property>
<property?name="transactionAttributes">
<props>
<prop?key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>?
使用示例:
如果你使用STRUTS,則需要這樣:
List?what_ur_view?=?XXXManager.find(

.);//取得你要展示的對(duì)象
//如果這個(gè)對(duì)象當(dāng)中有延遲加載的對(duì)象(SET)時(shí),則需要如下加載就行
this.hibernateUtil.initialize(what_ur_view,?"getTbShipmentSale");
//其中g(shù)etTbShipmentSale是其對(duì)象(SET也可以操作)?
在頁(yè)面顯示的時(shí)候,你就可以使用JSTL如下表述:
<c:out?value="${what_ur_view.tbShipmentSale.goodsReceivePersonPhone}"?/>//呵呵,是不是很爽呀。?
同樣的方法,我們也可以對(duì)一個(gè)SET在頁(yè)面進(jìn)行顯示,方法如下:
<c:forEach?items="${what_ur_view.tbShipmentProductMappingSet}"?var="ProductMapping"?varStatus="status">
<c:out?value="${ProductMapping.productNum}"?/>
<c:out?value="${ProductMapping.tbOutOfWarehouse.outOfWarehouseNum}"?/>
</c:forEach>
//呵呵,支持多級(jí)嵌套,?
在ACTION當(dāng)中則需要加入hibernateUtil.initialize(what_ur_view.getTbShipmentProductMappingSet(),
new?String[]?{?"getTbProduct",?"getTbOutOfWarehouse",
"getTbProductConfigure"?});?
呵,如果你要是在HIBERNATE當(dāng)中使用,這個(gè)就太簡(jiǎn)單了吧。
怎么樣?呵呵呵,
從此,我對(duì)STRUTS的標(biāo)簽深惡痛絕,而對(duì)JSTL情有獨(dú)鐘了。