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

下面主要是通過1個實體Bean實例,來理解其調用進程。其進程主要包括以下各個進程:
(1)配置數據源
(2)指定數據源
(3)開發1個實體Bean
(4)開發會話Bean進行調用
(5)打包并部署到JBoss服務器
(6)開發客戶端進行測試
看著上面6個步驟是否是覺得記不住啊,沒有關系,這個不需要記,理解了自然就會了。當我們需要新建1個項目時,(1)首先需要肯定數據源并且進行配置吧,這就是我們上面的第1個進程--配置數據源;(2)配置完數據源(1個或多個)后,我們就需要肯定當前實體Bean分別需要使用哪一個數據源,也就是第2個進程--指定數據源;(3)做好和數據庫連接的準備了,我們需要開發實體Bean來對應數據庫中的表,就是第3個進程--開發1個實體Bean;(4)實體Bean開發完成后,可以被會話Bean調用,也能夠被其他類調用,在本實例中我們采取會話Bean調用實體Bean,所以需要第4個進程--開發會話Bean進行調用;(5)到此我們服務器真個代碼編寫就完成了,但是我們還需要進行打包并部署到JBoss服務器上,以供客戶端調用,故第5個進程--打包并部署到JBoss服務器;(6)最后就是我們客戶端對服務器端組件的調用了,第6個進程--開發客戶端進行測試。
通過上面簡單通俗的介紹,不知道你對實體Bean調用進程的幾個步驟加深印象了沒有,暫時沒有也沒有關系,以后多用,用著用著就理解深入了,用著用著就爛記于心了。下面我在對這幾個進程進行1個詳細的演示和解說。
(1)配置數據源
在實際利用中,我們可能需要使用不同的數據庫,如MySQL、Oracle、MSSQL
Server等。各個數據庫的數據源配置模板都在%Jboss_Home%docsexamplesjca目錄下,共包括38中數據源的連接。要配置到某1個數據源的連接,需要進行以下步驟:
1.復制模板--復制該數據庫類型的配置模板到%Jboss_Home%serverdefaultdeploy目錄,并設置數據源參數(以MSSQL
Server為例);
<span style="font-size:18px;"><datasources>
<local-tx-datasource>
<!-- 數據源名稱 -->
<jndi-name>MSSQLDS</jndi-name>
<!-- 指定連接本地的Demo
數據庫 -->
<connection-url>jdbc:microsoft:sqlserver://localhost:8080;DatabaseName=Demo</connection-url>
<!--
數據庫驅動類 -->
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<!-- Demo
數據庫登錄用戶名-->
<user-name>sunliduan</user-name>
<!-- Demo
數據庫登錄密碼-->
<password>sunliduan</password>
<metadata>
<type-mapping>MSSQLSERVER2000</type-mapping>
</metadata>
</local-tx-datasource>
</datasources></span>
如果JBoss服務器處于啟動狀態,則此時JBoss會自動監控到該文件,并加載起來,并在控制臺輸出相應信息。
2.添加驅動--添加該數據庫的驅動程序包到%Jboss_Home%serverdefaultlib目錄,并重啟JBoss服務器加載該程序包。
各個數據庫的數據源配置都是這兩個步驟,基本類似。
(2)指定數據源
以上配置的數據源都是由JBoss服務器加載和管理的,要使用這些數據源,還需要在利用中指定援用哪個數據源。而這項工作的完成靠persistence.xml便可。
<span style="font-size:18px;"><SPANstyle="FONT-SIZE: 14px; FONT-FAMILY: MicrosoftYaHei"><persistence>
<!-- Name屬性用于定義持久化內容的名稱 -->
<persistence-unitname="demo">
<!-- Jta-data-source 用于指定實體Bean使用的數據源名稱 -->
<jta-data-source>java:/MSSQLDS</jta-data-source>
<!-- 廠商專有屬性(可選) -->
<properties>
<!--自動輸出schema創建DDL語句 -->
<propertyname="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence></SPAN></span>
這里需要注意的1點是:"hibernate.hbm2ddl.auto"的值,若為上文中的"create-drop",則在實體Bean發布及卸載時將自動創建及刪除相應的數據庫表。為了使以后實體Bean的改動能反應到數據庫表,建議使用update,這樣實體Bean添加1個屬性時能同時在數據庫表增加相應字段。
(3)開發實體Bean
實體Bean實際上對應了數據庫中的表,它是數據庫中表在Java類中的表現。EJB容器能夠根據實體Bean自動在數據庫中創建數據表。
開發1個實體Bean很簡單,只需要新建1個POJO類,添加與數據表字段同名的變量,同時使用1些注釋符來表示該實體Bean與數據庫表的對應映照關系便可。
<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需要實現Serializable接口,這樣就能夠有EJB客戶端創建該對象,并將該對象傳送到服務器端。
(4)開發會話Bean并調用
實體Bean既可以被會話Bean調用,也能夠被任何的Java類或JSP調用,在EJB利用程序中,我們通常會在會話Bean中調用實體Bean,來實現對數據庫的操作。
新建1個遠程的會話Bean組件后會生成1個遠程接口類和實現類。代碼以下:
<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: 用戶管理的實現類
* @Description: 用戶管理的實現類
* @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的管理容器。通過該對象,我們能夠實現與數據庫的各種交互,包括增刪改查等。再說@PersistenceContext,EntityManager通過注釋@PersistenceContext可以實現動態注入EntityManager對象,如果persistence.xml文件中配置了多個不同的持久化內容,則還需要通過unitName屬性來指定持久化名稱,以下:
<span style="font-size:18px;">@PersistenceContext(unitName="demo")
protected EntityManager em;</span>
(5)打包并部署到JBoss服務器
完成了以上的開發,我們就能夠將當前利用發布到JBoss中,構成JNDI服務以供外部訪問了。發布的方法很簡單,只需要導出該項目的JAR包到JBoss服務器的部署目錄%Jboss_Home%serverdefaultdeploy便可。然后JBoss服務器就會自動加載該服務,創建數據庫表,并且發布JNDI服務UserManagerBean/remote,我們就能夠通過客戶端訪問JNDI服務UserManagerBean/remote了。
(6)開發客戶端進行測試
首先我們需要把實體類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。然后創建了1個實體對象,調用addUser方法插入該對象。
這樣就是1個完全的利用實體Bean向數據庫中添加數據的1個小demo了。最后用1張圖來表示1下以上6個進程之間的關系:

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