ejb 2.0 3.0
在应用程序开发领域发生的一件事是数据的可用性。 有来自各种资源的各种数据。 一方面,这使应用程序比以往更加丰富。 另一方面,所有这些数据实在是一团糟。 如果您需要持久存储数据而不是仅仅读取数据,它将变得更加复杂。
在Java环境中,EJB已成为一种可靠的持久性方式,同时保持了良好的可维护性和适当的角色分离。 EJB V3.0继续了这一发展,带来了更多的工具和选项。 使用EJB并不困难。 借助Eclipse和一些基本概念,您可以在应用程序中利用它们的强大功能。
EJB V3.0使用基于注释的API简化了EJB的开发,在该API中,虽然可以使用远程/本地接口,本地/本地本地接口和部署描述符,但它们不是必需的。 开发实体EJB需要Java IDE,应用程序服务器和关系数据库。 WebSphere V6.x需要WebSphere Application Server V6.1功能部件包来创建EJB V3.0实体bean。 WebSphere V7具有对EJB V3.0的内置支持。 Eclipse IDE是最常用的开源Java IDE。 在本文中,我们将使用Eclipse-IBM WebSphere 7-IBM DB2 9.5组合开发EJB V3.0实体bean。
WebSphere中的EJB V3.0规范以Java Persistence API(JPA)为后盾。 JPA进一步基于其他持久性技术,例如Hibernate,JDO和TopLink。 JPA是用于对象关系映射的POJO持久性API,它利用元数据注释来定义Java对象与关系数据库之间的映射。 JPA支持用于静态和动态查询的类SQL语言。 JPA已集成到JSR 220:Enterprise JavaBeans V3.0规范中。
使用了WebSphere Application Server和DB2数据库的试用版,但是讨论的技术可以转移到WebSphere Application Server和DB2的社区版。 还提供了对WebSphere Application Server社区版的支持 。
启动WebSphere Application Server。 在“第一步”控制台中,选择“ 启动服务器” 。 WebSphere服务器已启动,如图1所示。
接下来,通过选择管理控制台链接来启动管理控制台/集成解决方案控制台。 在Integrated Solution Console窗口中,在JDBC provider表中选择Resources> JDBC> JDBC > New ,如图2所示。
在“ Create a new JDBC Provider
窗口中,选择“ 数据库” >“ DB2” ,“ 提供程序” >“ DB2通用JDBC驱动程序提供程序 ”和“ 实现” >“ 连接池”数据源 ,然后单击“ 下一步” ,如图3所示。
“ Summary
页面列出了JDBC提供程序配置的摘要。 选择完成 。 新的JDBC提供程序将添加到JDBC providers
表中。 选择新的JDBC提供程序,然后单击Save将JDBC提供程序存储到主配置中,如图4所示。
在配置数据源之前,需要一个J2EE连接器认证数据条目。 JDBC数据源使用J2EE连接器身份验证数据条目登录数据库。 在集成解决方案控制台中选择“ 安全性”>“全局安全性”节点。 接下来,在Authentication
子标题中选择Java Authentication and Authorization Service> J2C身份验证数据链接,如图5所示。
在用户标识和密码表中,单击“ 新建” 。 在新标题中,在Alias
字段中指定一个用户别名,一个User Id
,这是DB2数据库的登录ID,以及用于登录DB2数据库的密码,如图6所示。
单击保存将J2C认证数据条目存储到主配置中。 DB2数据库登录别名已添加到J2C认证数据表中,如图7所示。
要配置JDBC数据源,请选择先前配置的JDBC提供程序。 在“ DB2 Universal JDBC Provider
标头中,单击“ 数据源”链接,如图8所示。
在“数据源”表中单击“ 新建 ”以创建新的数据源。 指定一个JNDI名称,然后单击Next ,如图9所示。JNDI名称将在EJB V3.0实体bean的persistence.xml文件中使用,稍后将创建它。
为数据源指定特定于数据源的属性。 选择驱动程序类型 > 4 , 数据库名称 > 样本 , 服务器名称 > 本地主机和端口号 > 50000 。 单击Next ,如图10所示。
要为数据源选择J2C认证数据,请选择先前创建的认证别名。 单击Next ,如图11所示。
在数据源的“ Summary
页面中,选择“ 完成” 。 新的数据源将添加到表中。 单击保存将数据源存储到主配置。 在表中选择数据源 > 测试连接 。 数据源连接测试将指示测试是否成功,如图12所示。
从命令行工具(例如,命令编辑器或命令行处理器)访问DB2数据库。 要在默认的示例数据库SAMPLE中创建数据库表,请运行以下SQL脚本。 这将为EJB V3.0实体bean创建一个Catalog
表。
CREATE TABLE Catalog (id INT PRIMARY KEY NOT NULL,
journal VARCHAR(100), publisher VARCHAR(100), date VARCHAR(100),
title VARCHAR(100), author VARCHAR(100));
New Project
窗口中,选择“ EJB”>“ EJB Project” >“ 下一步” 。 New EJB Project
窗口中,指定项目名称(例如EJB3EntityBean )。 选择EJB模块版本 > 3.0 > 下一步 。 New
窗口中,选择Java> Class > Next 。 New Java Class
窗口中,默认情况下,“源”文件夹为EJB3EntityBean/ejbModule
。 指定包名称(例如com.ejb3.websphere )和类名称( Catalog ),然后单击Finish 。 将源文件夹ejbModule
添加到Java Build Path,如图14所示。
与添加Catalog.java
bean类相似,添加Java类CatalogTestBean.java
(会话bean), CatalogTestLocal.java
(本地业务接口)和CatalogTestRemote.java
(远程业务接口)。 要求EJB V3.0实体bean在META-INF
目录中具有persistence.xml
配置文件。
New
窗口中,选择XML> XML > 下一步 。 New XML File
窗口中,选择ejbModule> META-INF文件夹。 指定文件名 > persistence.xml > 完成 。 将persistence.xml
文件添加到META-INF
文件夹。 build.xml
脚本。 在项目文件夹中创建一个META-INF
文件夹,并将application.xml添加到该文件夹中。 webModule
文件夹,以创建实体EJB的JSP客户端,然后将EJB3Client.jsp添加到该文件夹中。 WEB-INF
文件夹添加到webModule
文件夹,并将web.xml文件添加到WEB-INF
文件夹。 EJB V3.0项目的目录结构如图15所示。 与EJB V2.0不同,在EJB V3.0中,实体Bean是普通旧Java对象(POJO)。 实体Bean映射是使用注释定义的,注释是在JDK V5中引入的,并且位于javax.persistence
包中。 带有@Entity
注释的POJO类是一个实体bean。 使用@Table
批注在类级别设置实体bean映射的模式和表。 如果未指定@Table
批注,则默认表名是实体bean类名。 我们将创建一个映射到Catalog
表的实体bean Catalog
。
@Entity
@Table(name="Catalog")
public class Catalog implements Serializable {
...
}
如果已将启用了缓存的实体Bean通过实体管理器保留到数据库中,则该实体Bean将通过缓存进行序列化。 因此,建议使用实体bean来实现java.io.Serializable
接口。 在实体bean类中,指定POJO属性。 还要指定serialVersionUID
,序列化运行时将其用于将版本号与可序列化的类相关联。 为实体bean属性添加getter和setter方法。 用@Id
注释指定标识符属性。 还有其他EJB V3.0批注,可以在实体bean中指定它们(请参阅参考资料 )。 清单1中显示了Catalog实体bean。
import java.io.Serializable;
import javax.persistence.*;
@Entity
@Table(name="Catalog")
public class Catalog implements Serializable {
private static final long serialVersionUID = 7422574264557894633L;
private long id;
private String journal;
private String publisher;
private String date;
private String title;
private String author;
public Catalog(){ super();}
public Catalog(Integer id, String journal, String publisher, String date,
String title, String author){
super();
this.id=id;
this.journal=journal;
this.publisher=publisher;
this.date=date;
this.title=title;
this.author=author;
}
@Id
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getJournal() {
return journal;
}
public void setJournal(String journal) {
this.journal = journal;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
persistence.xml
文件中的根元素是持久性。 需要命名persistence-unit
。 先前已在WebSphere V7应用程序服务器中配置了具有JNDI jdbc / DB2DS的JDBC数据源。 在persistence.xml
的jta-data-source
元素中指定JNDI名称。 WebSphere Application Server V7中的默认JPA持久性提供程序是Apache OpenJPA提供程序的版本。 将清单2复制到Eclipse中的persistence.xml
文件。
jdbc/DB2DS
WebSphere V7的限制是,如果在persistence
元素中使用以下属性指定了persistence.xml文件的模式位置,则会生成错误。
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
为了获得更好的性能,开发EJB的最佳实践之一(请参阅参考资料 )是从会话Bean访问实体Bean。 使用消耗比有状态会话Bean少的资源的无状态会话Bean来调用实体Bean方法。 无状态会话Bean类使用@Stateless
注释进行注释。 无状态会话Bean类CatalogTestBean
实现了CatalogTestLocal
和CatalogTestRemote
接口。 使用EntityManager
API创建,查找,查询和删除实体实例。 使用@PersistenceContext
批注注入EntityManager
。
@PersistenceContext
EntityManager em;
使用JNDI绑定Session_Bean_Class_Name
部署到WebSphere服务器的会话bean具有本地业务接口的默认JNDI名称绑定,即ejblocal:Session_Bean_Class_Name
。 为了方便从JSP客户端访问JNDI名称, public static final
变量分配给本地JNDI名称。
public static final String LocalJNDIName = "ejblocal:"
+ CatalogTestBean.class.getSimpleName();
接下来,创建一个test()
方法,该方法返回从测试客户端调用的String
。 使用test()
方法创建和持久化实体实例,查询实体实例并删除实体实例,所有这些都使用EntityManager
对象(该对象已在会话Bean类中注入)。 注入EntityManager
暗示的实例EntityManager
是可用的会话bean。 创建实体bean类的实例。
Catalog catalog = new Catalog(new Integer(1), "IBM developerWorks", "IBM",
"July 2006", "The Java XPath API", "Elliotte Rusty Harold");
使用persist()
方法将实体实例persist()
到数据库中。
em.persist(catalog);
同样,保留两个以上的实体实例。 接下来,使用EntityManager
对象的createQuery
方法创建查询。 该字符串被指定为EJB-QL查询。 使用getResultList()
方法执行并以List
返回结果。 例如,选择与作者Elliotte Rusty Harold相对应的目录条目。
List catalogEntry = em.createQuery("SELECT c from Catalog c where c.author=:name").
setParameter("name", "Elliotte Rusty Harold").getResultList();
为测试方法的返回值创建一个字符串变量。
String retValue = "A catalog entry: ";
遍历结果列表以输出实体实例的属性。
for (Iterator iter = catalogEntry.iterator(); iter.hasNext();) {
Catalog element = (Catalog) iter.next();
retValue = retValue + "
" + element.getJournal() + "
"+
element.getPublisher() + "
" + element.getDate() + "
"+ element.getTitle() +
"
" + element.getAuthor()+"
";
}
创建并运行EJB-QL查询以返回Catalog
数据库中的所有标题。
List allTitles = em.createQuery("SELECT c from Catalog c").getResultList();
可以使用remove()
方法remove()
实体实例。
em.remove(catalog2);
相应的数据库行将从Catalog
表中删除。 随后,创建并运行查询以列出映射到数据库的所有其余实体实例。 清单3中显示了会话bean类CatalogTestBean
。
package com.ejb3.websphere;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class CatalogTestBean implements CatalogTestRemote, CatalogTestLocal {
@PersistenceContext
EntityManager em;
public static final String LocalJNDIName = "ejblocal:"
+ CatalogTestBean.class.getSimpleName();
public String test() {
Catalog catalog = new Catalog(new Integer(1), "IBM developerWorks",
"IBM", "July 2006", "The Java XPath API",
"Elliotte Rusty Harold");
em.persist(catalog);
Catalog catalog2 = new Catalog(new Integer(2), "IBM developerWorks",
"IBM", "March 2009", "Use XQuery for the presentation layer",
"Brian M. Carey");
em.persist(catalog2);
Catalog catalog3 = new Catalog(new Integer(3), "IBM developerWorks",
"IBM", "April 2008", "Use XQuery from a Java environment",
"Brett McLaughlin");
em.persist(catalog3);
String retValue = "A catalog entry: ";
List catalogEntry = em.createQuery(
"SELECT c from Catalog c where c.author=:name").setParameter(
"name", "Elliotte Rusty Harold").getResultList();
for (Iterator iter = catalogEntry.iterator(); iter.hasNext();) {
Catalog element = (Catalog) iter.next();
retValue = retValue + "
" + element.getJournal() + "
"
+ element.getPublisher() + "
" + element.getDate()
+ "
" + element.getTitle() + "
"
+ element.getAuthor() + "
";
}
retValue = retValue + "All Titles: ";
List allTitles = em.createQuery("SELECT c from Catalog c")
.getResultList();
for (Iterator iter = allTitles.iterator(); iter.hasNext();) {
Catalog element = (Catalog) iter.next();
retValue = retValue + "
" + element.getTitle() + "
";
}
em.remove(catalog2);
retValue = retValue + "All Entries after removing an entry: ";
List allCatalogEntries = em.createQuery("SELECT c from Catalog c")
.getResultList();
for (Iterator iter = allCatalogEntries.iterator(); iter.hasNext();) {
Catalog element = (Catalog) iter.next();
retValue = retValue + "
" + element + "
";
}
return retValue;
}
}
为会话bean添加一个远程接口和一个本地接口(请参见清单4)。
package com.ejb3.websphere;
import javax.ejb.Remote;
@Remote
public interface CatalogTestRemote {
public String test();
}
package com.ejb3.websphere;
import javax.ejb.Local;
@Local
public interface CatalogTestLocal {
public String test();
}
到目前为止,已经创建了包含业务逻辑的实体Bean和作为该实体Bean的包装器的会话Bean。 接下来,创建一个测试客户端JSP EJB3Client.jsp,在其中运行会话bean的test()
。 要创建的实例CatalogTestLocal
使用JNDI查找,首先创建一个IntialContext
对象。 使用会话Bean中的JNDI查找获得CatalogTestLocal
实例。
InitialContext context = new InitialContext();
CatalogTestLocal beanLocal = (CatalogTestLocal)
context.lookup(CatalogTestBean.LocalJNDIName);
调用会话bean的test()
方法并输出返回值。
String catalog=beanLocal.test();
<%=catalog %>
清单5中显示了测试客户端JSP EJB3Client.jsp
。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="com.ejb3.websphere.*, javax.naming.*" %>
EJB3 Client
<% InitialContext context = new InitialContext();
CatalogTestLocal beanLocal = (CatalogTestLocal)
context.lookup(CatalogTestBean.LocalJNDIName);
String catalog=beanLocal.test();
%>
<%=catalog %>
WEB-INF/web.xml
文件指定Web部署描述符。 由于未指定Web配置,因此将以下清单复制到web.xml
。
为EJB和Web模块创建一个application.xml
部署描述符。 将清单6复制到application.xml。
ejb3.jar
websphere.war
websphere
所有的类和配置文件都已完成,可以创建EJB V3.0实体bean。 接下来,编译这些类以创建EJB JAR文件,WAR文件和EAR文件,然后将EAR文件部署到WebSphere服务器。 使用build.xml脚本来编译EJB类,创建EJB EAR文件,并将EJB EAR文件部署到WebSphere。 有关Apache Ant的介绍,请参阅Apache Ant用户手册(请参阅参考资料 )。 在构建脚本中,为脚本中使用的各种目录路径指定属性,例如WebSphere服务器目录,构建目录和WebSphere部署目录。 指定编译EJB类所需的各种JAR文件的类路径。 指定表1中讨论的目标。
目标 | 描述 |
---|---|
准备 | 创建构建目录和已编译类的目录 |
编译 | 编译EJB类 |
罐 | 创建一个EJB JAR文件 |
战争 | 创建一个WAR文件 |
组装应用 | 创建一个EAR文件 |
部署 | 将EAR文件部署到WebSphere服务器。 WebSphere部署目录为C:\ Program Files \ IBM \ WebSphere \ AppServer \ installableApps |
清洁 | 删除JAR,WAR和EAR文件 |
清单7显示了build.xml脚本。
在Eclipse中运行构建脚本。 在Package Explorer中,右键单击build.xml > Run As> Ant Build ,如图16所示。
构建脚本中的默认构建目标是deploy ,每个目标都依赖于前一个目标。 运行prepare , compile , jar , war , assemble-app和deploy目标,并将EAR文件ejb3.ear部署到WebSphere服务器,如图17所示。
在管理控制台中,单击应用程序>新建应用程序 。 在“新建应用程序”标题中,单击“ 新建企业应用程序” 。 指定ejb3.ear文件的路径,然后单击Next ,如图18所示。
对于条目“如何安装应用程序”,选择“ 详细信息” >“ 下一步” 。 对于条目“选择安装选项标题”,单击复选框“ 预编译JavaServer Pages文件”和“ 部署企业bean” 。 指定要安装应用程序的目录为“ C:\ Program Files \ IBM \ WebSphere \ AppServer \ profiles \ AppSrv01 \ installedApps \ dvohra09-PCNode01Cell”(对于Windows),然后单击Next ,如图19所示。安装的scope
目录路径可能与示例不同。
在“群集和服务器”标题中选择默认设置,然后单击“ 下一步” 。 在“提供用于编译JSP的选项”中选择默认设置,然后单击“ 下一步” 。 在“提供用于执行EJB部署的选项”标头中,选择“ 数据库” >“ 9.5” ,“ JDK编译级别” >“ 6.0 ”以及“ 数据库访问” >“ JDBC” >“ 下一步” ,如图20所示。
在“为Web模块提供JSP重新加载选项”标题中,选择默认设置,然后单击“ 下一步” 。 在“映射共享库”标题中,选择默认设置,然后单击“ 下一步” 。 在“映射共享库关系”标题中,选择默认设置,然后单击“ 下一步” 。 在“提供bean的JNDI名称”标题中, 为所有接口选择JNDI名称,并指定目标资源JNDI名称 ,如图21所示,然后单击Next 。
在“绑定EJB业务”标题中,选择默认设置,然后单击“ 下一步” 。 在“映射Web模块的虚拟主机”标题中,选择websphere.war WAR文件,选择“ default_host”虚拟主机,然后单击“应用”。 单击下一步 。 在“ Map context roots for Web modules
的Map context roots for Web modules
目录”标头中,将websphere.war
Web上下文的根目录指定为“ websphere”。单击“ 下一步” 。在“模块的元数据”标头中,选择默认设置,然后单击“ 下一步” 。 在“摘要”页面中,单击完成 。 如图22所示,将安装ejb3.ear EAR文件并部署ejb3.jar EJB JAR文件。单击Save保存主配置更改。
单击Start初始化EJB3应用程序,该应用程序已安装并启动,如图23所示。
要为EJB V3.0实体Bean运行JSP客户端,请使用URL http:// localhost:9080 / websphere / Catalog.jsp调用JSP。 会话bean的test()
方法被调用。 创建了三个实体bean实例并将其持久化到DB2。 如图24的客户机JSP输出所示,列出了与作者Elliotte Rusty Harold对应的实体实例的entity-bean属性值。 列出所有实体实例的标题。 如后续查询所示,实体实例将被删除以获取所有实体实例,该实体实例仅列出两个实体实例。
EJB V3.0支持是WebSphere V7中的一项新功能。 Eclipse-WebSphere7-DB2 9.5的组合非常适合开发EJB V3.0实体bean。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-eclipse-ejb3/index.html
ejb 2.0 3.0