對(duì)于一個(gè)應(yīng)用來說,實(shí)體對(duì)象即是這個(gè)應(yīng)用的數(shù)據(jù)基礎(chǔ),一開始設(shè)計(jì)都是從數(shù)據(jù)模型設(shè)計(jì)開始的。那我們就從這個(gè)Seam的entities開始吧。
在Seam中你有兩種方式創(chuàng)建你的實(shí)體對(duì)象,一是從數(shù)據(jù)庫(kù)生成,二是自己創(chuàng)建,再由seam幫你將對(duì)應(yīng)的數(shù)據(jù)表建起來。從應(yīng)用的角度來說,兩種方式?jīng)]有啥區(qū)別,但從開發(fā)的角度講,推薦使用生成的方式。因?yàn)檫@樣可以剩下很多敲代碼的時(shí)間。呵呵。好戲放后面,讓我們先看自己創(chuàng)建entity的過程。
前提是你的工程已經(jīng)創(chuàng)建完畢(如何創(chuàng)建過程請(qǐng)看本系列《1》)。
一般實(shí)體類都放在src/model下。便于辨別那些是業(yè)務(wù)對(duì)象,哪些是數(shù)據(jù)對(duì)象(關(guān)于Seam的分層網(wǎng)上很多地方有說,這里就不說了)。在src/model文件夾上右鍵-》new->Seam Entity。就可以看到如下界面:
這里就只需要填寫名稱即可。解釋一下它們的意思:
Seam Project:即屬于那個(gè)工程
Seam entity class name:即這個(gè)類的名稱
Package name:屬于那個(gè)包的
Master page name:這個(gè)會(huì)自動(dòng)生成的家伙是說你的列表頁面和業(yè)務(wù)動(dòng)作處理(action)的名稱
Page name:這個(gè)也會(huì)自動(dòng)生成,是指明細(xì)頁面的名稱和業(yè)務(wù)動(dòng)作處理的名稱(兩個(gè)是相同名稱的)
隨便起個(gè)名字,點(diǎn)Finish,可能需要等待一段時(shí)間,這是因?yàn)镾eam自動(dòng)創(chuàng)建了一個(gè)xhtml頁面,正在試圖打開。打開這個(gè)東西需要一點(diǎn)時(shí)間
創(chuàng)建成功后。在你所選的包下就會(huì)多一個(gè)類。里面只有三個(gè)屬性:id,version,name。以我創(chuàng)建的User類為例:
@Entity
public class User implements Serializable {
//seam-gen attributes (you should probably edit these)
private Long id;
private Integer version;
private String name;
//add additional entity attributes
//seam-gen attribute getters/setters with annotations (you probably should edit)
@Id @GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Version
public Integer getVersion() {
return version;
}
private void setVersion(Integer version) {
this.version = version;
}
@Length(max=20)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
這個(gè)類實(shí)現(xiàn)自Serializable是因?yàn)檫@個(gè)類需要被序列化,當(dāng)遇到特殊情況時(shí)可以起寫作用。先解釋下這些注解吧。
@Entity:標(biāo)注這是一個(gè)實(shí)體對(duì)象 這是JPA的標(biāo)記。表明即是類名,當(dāng)然,你也可以讓這兩個(gè)東西不是對(duì)應(yīng)關(guān)系,在
@Entity下加個(gè)@Table注解即可。比如
@Entity
@Table(name = "BookType", catalog = "test")
@Id 主鍵標(biāo)識(shí),為了確保對(duì)象的唯一性,建議每個(gè)entity都加一個(gè)主鍵,否則你就等著出錯(cuò)吧。呵呵
@GeneratedValue 表示主鍵值為自動(dòng)生成值
@Version 這個(gè)是jpa的樂觀鎖機(jī)制。有興趣了解樂觀鎖及悲觀鎖的可以看hibernate的資料,篇幅太長(zhǎng),這里就不介紹了。
@Length(max=20) 限制長(zhǎng)度為最大20,這個(gè)在作驗(yàn)證時(shí)有用。
恩。這個(gè)實(shí)體類就這么簡(jiǎn)單。呵呵,你還需要其他字段就再加上去吧。。
其實(shí)到這個(gè),整個(gè)CRUD的頁面和處理方法都寫好了。這時(shí)只要將項(xiàng)目部署到服務(wù)器,然后訪問列表頁面即可。忘了說了,我這里生成的頁面是userList.xhtml和user.xhtml。工程名為SeamTest。所以我要訪問http://localhost:8080/SeamTest/userList.seam,一個(gè)增刪改查就出來了哦。還有比這更快的嗎。呵呵,現(xiàn)在要在頁面上添加?xùn)|西就照葫蘆畫瓢。Ctrl+C and Ctrl+v就出來了。如果頁面不符合規(guī)則,再調(diào)也可以,這里簡(jiǎn)單說下seam的幫定機(jī)制,還是已我的user為例:
<h:inputText id="name" required="true"
value="#{userHome.instance.name}"/>
seam 的幫定機(jī)制是根據(jù)value進(jìn)行的。也就是說,無論你的id寫的是什么。這個(gè)文本框的東西最終都要賦值到name上。這就是seam的邦定機(jī)制。這樣邦定會(huì)有一個(gè)問題。等以后介紹,現(xiàn)在先接著看
生成entities。用數(shù)據(jù)庫(kù)表生成entities就更簡(jiǎn)單了。在src/model文件夾上右鍵,然后選擇new->Seam Generate entities。會(huì)彈出這樣的窗口:
不用修改什么選項(xiàng),直接finish就可以了。這樣entity就會(huì)生成了,就連頁面什么的都生成了。增刪改查也寫好了。呵呵,你就做下微調(diào)就可以了。這里需要注意的是,你剛剛通過Seam創(chuàng)建的表也被當(dāng)作普通表生成到你的應(yīng)用程序里。這樣如果你使用的是linux平臺(tái),就會(huì)多一個(gè)UserList.xhtml(剛才那個(gè)是userList.xhtml)。如果是windows平臺(tái)不知道會(huì)怎么樣哦(windows文件名不分大小寫)。
可能的錯(cuò)誤:有幾個(gè)網(wǎng)友跟我說他們生成entities時(shí)發(fā)生了錯(cuò)誤。錯(cuò)誤大意是找不到模板或session包。這個(gè)是由于使用的版本太新造成的。JBoss Tools3.0僅支持Seam2.0,不要使用2.1哦。過寫時(shí)候我把那個(gè)錯(cuò)誤信息貼上來,供大家參考。
大概就這些了。有什么問題歡迎討論。