EJB初級篇--EJB組件之實體Bean
來源:程序員人生 發(fā)布時間:2015-01-07 08:29:57 閱讀次數(shù):3422次
上文我們對會話Bean的生命周期和兩個子類型(有狀態(tài)會話Bean和無狀態(tài)會話Bean)進行了詳細解說,本篇博文中我們繼續(xù)說說EJB組件中的實體Bean。
其實實體Bean就是1個加了注釋符(@Entity)的簡單java對象(POJO),實體關系和O/R映照也是通過注釋符來定義的,并且提供了幾種不同的數(shù)據(jù)庫操作規(guī)范。1旦被EntityManager訪問,它就成了1個持久化對象,我們就能夠像之前使用Hibernate1樣來使用實體對象了。
下圖是實體Bean的內(nèi)容結(jié)構(gòu)圖,方便我們宏觀的了解實體Bean。通過實體管理器操作實體Bean,來實現(xiàn)對數(shù)據(jù)庫的更新、JPQL查詢和SQL查詢。可以說,實體管理器是工具,實體Bean則是數(shù)據(jù)。

下面主要是通過1個實體Bean實例,來理解其調(diào)用進程。其進程主要包括以下各個進程:
(1)配置數(shù)據(jù)源
(2)指定數(shù)據(jù)源
(3)開發(fā)1個實體Bean
(4)開發(fā)會話Bean進行調(diào)用
(5)打包并部署到JBoss服務器
(6)開發(fā)客戶端進行測試
看著上面6個步驟是否是覺得記不住啊,沒有關系,這個不需要記,理解了自然就會了。當我們需要新建1個項目時,(1)首先需要肯定數(shù)據(jù)源并且進行配置吧,這就是我們上面的第1個進程--配置數(shù)據(jù)源;(2)配置完數(shù)據(jù)源(1個或多個)后,我們就需要肯定當前實體Bean分別需要使用哪一個數(shù)據(jù)源,也就是第2個進程--指定數(shù)據(jù)源;(3)做好和數(shù)據(jù)庫連接的準備了,我們需要開發(fā)實體Bean來對應數(shù)據(jù)庫中的表,就是第3個進程--開發(fā)1個實體Bean;(4)實體Bean開發(fā)完成后,可以被會話Bean調(diào)用,也能夠被其他類調(diào)用,在本實例中我們采取會話Bean調(diào)用實體Bean,所以需要第4個進程--開發(fā)會話Bean進行調(diào)用;(5)到此我們服務器真?zhèn)€代碼編寫就完成了,但是我們還需要進行打包并部署到JBoss服務器上,以供客戶端調(diào)用,故第5個進程--打包并部署到JBoss服務器;(6)最后就是我們客戶端對服務器端組件的調(diào)用了,第6個進程--開發(fā)客戶端進行測試。
通過上面簡單通俗的介紹,不知道你對實體Bean調(diào)用進程的幾個步驟加深印象了沒有,暫時沒有也沒有關系,以后多用,用著用著就理解深入了,用著用著就爛記于心了。下面我在對這幾個進程進行1個詳細的演示和解說。
(1)配置數(shù)據(jù)源
在實際利用中,我們可能需要使用不同的數(shù)據(jù)庫,如MySQL、Oracle、MSSQL
Server等。各個數(shù)據(jù)庫的數(shù)據(jù)源配置模板都在%Jboss_Home%docsexamplesjca目錄下,共包括38中數(shù)據(jù)源的連接。要配置到某1個數(shù)據(jù)源的連接,需要進行以下步驟:
1.復制模板--復制該數(shù)據(jù)庫類型的配置模板到%Jboss_Home%serverdefaultdeploy目錄,并設置數(shù)據(jù)源參數(shù)(以MSSQL
Server為例);
<span style="font-size:18px;"><datasources>
<local-tx-datasource>
<!-- 數(shù)據(jù)源名稱 -->
<jndi-name>MSSQLDS</jndi-name>
<!-- 指定連接本地的Demo
數(shù)據(jù)庫 -->
<connection-url>jdbc:microsoft:sqlserver://localhost:8080;DatabaseName=Demo</connection-url>
<!--
數(shù)據(jù)庫驅(qū)動類 -->
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<!-- Demo
數(shù)據(jù)庫登錄用戶名-->
<user-name>sunliduan</user-name>
<!-- Demo
數(shù)據(jù)庫登錄密碼-->
<password>sunliduan</password>
<metadata>
<type-mapping>MSSQLSERVER2000</type-mapping>
</metadata>
</local-tx-datasource>
</datasources></span>
如果JBoss服務器處于啟動狀態(tài),則此時JBoss會自動監(jiān)控到該文件,并加載起來,并在控制臺輸出相應信息。
2.添加驅(qū)動--添加該數(shù)據(jù)庫的驅(qū)動程序包到%Jboss_Home%serverdefaultlib目錄,并重啟JBoss服務器加載該程序包。
各個數(shù)據(jù)庫的數(shù)據(jù)源配置都是這兩個步驟,基本類似。
(2)指定數(shù)據(jù)源
以上配置的數(shù)據(jù)源都是由JBoss服務器加載和管理的,要使用這些數(shù)據(jù)源,還需要在利用中指定援用哪個數(shù)據(jù)源。而這項工作的完成靠persistence.xml便可。
<span style="font-size:18px;"><SPANstyle="FONT-SIZE: 14px; FONT-FAMILY: MicrosoftYaHei"><persistence>
<!-- Name屬性用于定義持久化內(nèi)容的名稱 -->
<persistence-unitname="demo">
<!-- Jta-data-source 用于指定實體Bean使用的數(shù)據(jù)源名稱 -->
<jta-data-source>java:/MSSQLDS</jta-data-source>
<!-- 廠商專有屬性(可選) -->
<properties>
<!--自動輸出schema創(chuàng)建DDL語句 -->
<propertyname="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence></SPAN></span>
這里需要注意的1點是:"hibernate.hbm2ddl.auto"的值,若為上文中的"create-drop",則在實體Bean發(fā)布及卸載時將自動創(chuàng)建及刪除相應的數(shù)據(jù)庫表。為了使以后實體Bean的改動能反應到數(shù)據(jù)庫表,建議使用update,這樣實體Bean添加1個屬性時能同時在數(shù)據(jù)庫表增加相應字段。
(3)開發(fā)實體Bean
實體Bean實際上對應了數(shù)據(jù)庫中的表,它是數(shù)據(jù)庫中表在Java類中的表現(xiàn)。EJB容器能夠根據(jù)實體Bean自動在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表。
開發(fā)1個實體Bean很簡單,只需要新建1個POJO類,添加與數(shù)據(jù)表字段同名的變量,同時使用1些注釋符來表示該實體Bean與數(shù)據(jù)庫表的對應映照關系便可。
<span style="font-size:18px;">/**
* @ClassName: 用戶實體Bean
* @Description: 用戶實體Bean
* @author 孫麗端
* @date 2014年11月28日20:22:51
*/
package com.tgb.ejb;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="user")
public class User implements Serializable {
private int id; //用戶ID
private String username; //用戶名
private String password; //密碼
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="userName",length=50)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name="password",length=50)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}</span>
需要注意:實體Bean需要實現(xiàn)Serializable接口,這樣就能夠有EJB客戶端創(chuàng)建該對象,并將該對象傳送到服務器端。
(4)開發(fā)會話Bean并調(diào)用
實體Bean既可以被會話Bean調(diào)用,也能夠被任何的Java類或JSP調(diào)用,在EJB利用程序中,我們通常會在會話Bean中調(diào)用實體Bean,來實現(xiàn)對數(shù)據(jù)庫的操作。
新建1個遠程的會話Bean組件后會生成1個遠程接口類和實現(xiàn)類。代碼以下:
<span style="font-size:18px;">/**
* @ClassName: 用戶管理的遠程接口類
* @Description: 用戶管理的遠程接口類
* @author 孫麗端
* @date 2014年11月28日20:22:51
*/
package com.tgb.ejb;
import javax.ejb.Remote;
@Remote
public interface UserManager {
public void addUser(User user);
}</span>
<span style="font-size:18px;">/**
* @ClassName: 用戶管理的實現(xiàn)類
* @Description: 用戶管理的實現(xiàn)類
* @author 孫麗端
* @date 2014年11月28日20:22:51
*/
package com.tgb.ejb;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@Local
public class UserManagerBean implements UserManager {
@PersistenceContext
protected EntityManager em;
@Override
public void addUser(User user) {
em.persist(user); //保存記錄
}
}</span>
其中我們比較陌生的多是@PersistenceContext和EntityManager。先說EntityManager,它是實體管理器,也就是實體Bean的管理容器。通過該對象,我們能夠?qū)崿F(xiàn)與數(shù)據(jù)庫的各種交互,包括增刪改查等。再說@PersistenceContext,EntityManager通過注釋@PersistenceContext可以實現(xiàn)動態(tài)注入EntityManager對象,如果persistence.xml文件中配置了多個不同的持久化內(nèi)容,則還需要通過unitName屬性來指定持久化名稱,以下:
<span style="font-size:18px;">@PersistenceContext(unitName="demo")
protected EntityManager em;</span>
(5)打包并部署到JBoss服務器
完成了以上的開發(fā),我們就能夠?qū)斍袄冒l(fā)布到JBoss中,構(gòu)成JNDI服務以供外部訪問了。發(fā)布的方法很簡單,只需要導出該項目的JAR包到JBoss服務器的部署目錄%Jboss_Home%serverdefaultdeploy便可。然后JBoss服務器就會自動加載該服務,創(chuàng)建數(shù)據(jù)庫表,并且發(fā)布JNDI服務UserManagerBean/remote,我們就能夠通過客戶端訪問JNDI服務UserManagerBean/remote了。
(6)開發(fā)客戶端進行測試
首先我們需要把實體類User.java和接口類UserManager.java導出為Jar包添加到客戶端項目的類路徑下,然后新建測試類UserManagerClient.java,代碼以下:
<span style="font-size:18px;">/**
* @ClassName: 用戶管理的客戶端測試類
* @Description: 用戶管理的客戶端測試類
* @author 孫麗端
* @date 2014年11月28日20:22:51
*/
package com.tgb.ejb;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class UserManagerClient {
public static void main(String[] args) throws NamingException {
InitialContext context = new InitialContext();
UserManager usermanager = (UserManager)context.lookup("UserManagerBean/remote");
User user = new User();
user.setUsername("孫麗端");
user.setPassword("sunliduan");
usermanager.addUser(user);
System.out.print("用戶已成功保存!");
}
}</span>
該類就通過訪問遠程JNDI服務“UserManagerBean/remote”,獲得了遠程會話Bean實例usermanager。然后創(chuàng)建了1個實體對象,調(diào)用addUser方法插入該對象。
這樣就是1個完全的利用實體Bean向數(shù)據(jù)庫中添加數(shù)據(jù)的1個小demo了。最后用1張圖來表示1下以上6個進程之間的關系:

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈