作者:Andrei Cioroianu
了解如何使用 Oracle Enterprise Pack for Eclipse (OEPE) 的 Java 持久性 API (JPA) 构建 Java EE 应用程序,从而将对象映射到关系数据库。
Oracle Enterprise Pack for Eclipse (OEPE) 是一系列经认证的插件,用于开发可以从 Eclipse IDE 轻松部署到 Oracle WebLogic Server 上的 Java EE 应用程序。在本文中,您将了解如何使用 OEPE 的 Java 持久性 API (JPA) 编辑器和向导从现有表或 Java 类创建实体。您还将了解如何开发用于测试实体的会话 Bean 和 Servlet。所有这些组件都将打包到一个在 WebLogic Server 上运行的 Java EE 应用程序中。本文假设您已经安装了带有 OEPE 11g、Oracle WebLogic 10g 第 3 版和 Oracle 数据库 XE 的 Eclipse 3.4。
应用程序设置
在本部分中,您将了解如何在 Eclipse 中配置 WebLogic,以便能够在代码中使用 Java EE API 并从 IDE 直接部署应用程序(如后文中所示)。您还将了解如何在 Eclipse 和 WebLogic 中设置数据源并使用 OEPE 11g 向导创建 JPA 项目。
在 Eclipse 中配置 Oracle WebLogic Server
首先,确保已正确配置 WebLogic 域。要创建一个新域或查看现有域,单击 Start > Programs > Oracle Fusion Middleware > WebLogic Server 10.3 > Tools > Configuration Wizard。
图-1
在验证或创建 WebLogic 域之后,返回 Eclipse,单击 File > New > Other...,选择 Server 并单击 Next。
图-2
输入服务器的主机名,选择 Oracle WebLogic Server 10gR3 并单击 Next。
图-3
选择 WebLogic Home 并单击 Next。
图-4
选择 Server Type 和 Domain Directory,然后单击 Finish。
图-5
要从 Eclipse 启动 WebLogic,转至 Servers 视图,右键单击 Oracle WebLogic Server 10gR3 并单击 Start。
从 Eclipse 和 WebLogic 连接到 Oracle 数据库
如果您刚刚安装 Oracle 数据库,则必须取消锁定 HR 用户,这样才可以访问 Oracle 数据库 XE 的示例模式。单击 Start > Programs > Oracle Database 10g Express Edition > Go To Database Home Page。使用安装 Oracle 数据库 XE 时提供的口令,以 SYSTEM 身份登录,单击 Administration > Database Users > HR,输入 HR 用户的口令两次,选择 Unlocked 并单击 Alter User。
图-6
现在,您可以在 Eclipse 中配置数据库连接。单击 Window > Show View > Other...,选择 Data Management > Data Source Explorer 并单击 OK。右键单击 Database Connections,单击 New,选择 Oracle Database Connection,输入连接名 hr,然后单击 Next。
图-7
选择 Oracle Database 10g Driver Default,如果需要,则更改 jdbc:oracle:thin:@localhost:1521:xe URL 中的服务器名称,输入用户名 hr 及其口令,单击 Test Connection 验证所有内容都正确,然后单击 Finish。
图-8
右键单击 hr 模式,如果尚未连接,则单击 Connect,展开 hr > orcl > Schemas,右键单击 HR,然后单击 Show in Schema Viewer。
图-9
您还必须在 WebLogic 中配置 hr 数据源以便可以在应用程序中使用。在 Web 浏览器中打开 http://localhost:7001/console/,登录并单击 JDBC > Data Sources。单击 New,在 name 域中输入 hr,在 JNDI name 域中输入 hr,选择 Oracle 数据库类型,选择 Oracle's Driver (Thin) Versions:9.0.1, 9.2.0, 10, 11,然后单击 Next。保留 Transaction Options 不变,单击 Next。输入数据库名称 xe、您的数据库主机名、端口号 1521、用户名 hr、口令,然后单击 Next。验证 URL(例如 jdbc:oracle:thin:@localhost:1521:xe),然后单击 Next。在最后一个屏幕中,选中 AdminServer 并单击 Finish。
重要事项! 在 WebLogic Server Administration Console 中单击 Log Out,以便从 Eclipse 中部署应用程序。如果您在 Eclipse 中看到以下错误,应转至 WebLogic 控制台并注销。
图-10
创建 JPA 项目
单击 File > New > Project...在 New Project 窗口中,展开 JPA 节点并选择 JPA Project。然后单击 Next。
图-11
输入 HRModel 作为名称,保持 Oracle WebLogic Server v10.3 目标运行时不变,使用 Utility JPA project with Java 5.0 配置,选择 Add project to an EAR 复选框,在 EAR Project Name 的文本域中输入 HRApp,然后单击 Next。
图-12
默认的 JPA 平台为 Generic,这意味着您仅能使用标准的 JPA 1.0 功能。如果要使用将添加到 JPA 2.0 的特性或希望配置特定于 EclipseLink JPA 实施的属性,如 Persistence Unit Customization、Caching、Logging、Session Options 和 Schema Generation,选择 EclipseLink 平台。选择 hr 连接,保留其余设置不变并单击 Finish。
图-13
当询问您是否要打开 JPA 透视图时,单击 Yes。
图-14
创建并修改实体
在本部分中,您将学习如何从现有表或 Java 类生成 JPA 实体、如何在 JPA Entity Editor 中查看其关联、如何在 JPA Structure 和 JPA Details 视图中修改您的实体以及如何使用 JPA 配置编辑器。OEPE 11g 提供了以上所有向导。
从表创建实体
接下来,您将从 HR 模式的 DEPARTMENTS 和 EMPLOYEES 表生成两个实体类。下面包括了这些表的 CREATE 语句。由于表已经存在,您不必运行这些语句。注意看一下外键,因为我们将在后文中对其进行讨论。
CREATE TABLE "DEPARTMENTS" ("DEPARTMENT_ID" NUMBER(4,0), "DEPARTMENT_NAME" VARCHAR2(30) CONSTRAINT "DEPT_NAME_NN" NOT NULL ENABLE, "MANAGER_ID" NUMBER(6,0), "LOCATION_ID" NUMBER(4,0), CONSTRAINT "DEPT_ID_PK" PRIMARY KEY ("DEPARTMENT_ID") ENABLE, CONSTRAINT "DEPT_LOC_FK" FOREIGN KEY ("LOCATION_ID") REFERENCES "LOCATIONS" ("LOCATION_ID") ENABLE, CONSTRAINT "DEPT_MGR_FK" FOREIGN KEY ("MANAGER_ID") REFERENCES "EMPLOYEES" ("EMPLOYEE_ID") ENABLE ) |
右键单击新创建的 HRModel 项目,单击 JPA > Generate Custom JPA Entities...,确保已选择 hr 连接,然后单击 Connect 图标(如果该图标处于启用状态。如果您已经连接,则该按钮处于禁用状态。)选择 DEPARTMENTS 和 EMPLOYEES 表,然后单击 Next。
图-15
在实际的应用程序中,通常,您将生成该模式的所有表的实体。但是出于学习目的,表越少越简单。JPA 向导将分析外键,为该示例所选的两个表提出三个表关联建议。
图-16
在大多数情况下,仅凭该模式所包含的信息,向导还不足以确定您到底需要什么。因此,您通常需要编辑关联。单击第一个关联,位于 DEPARTMENTS 和 EMPLOYEES 之间。将 employee 属性重命名为 manager,然后取消选中 Generate a reference to a collection of DEPARTMENTS in EMPLOYEES。
图-17
单击第二个关联,使每个部门与其员工相对应。此处未作更改。
图-18
单击第三个关联,使每个员工与其主管相对应。该信息也可通过前面的关联获得。因此,第三个关联是多余的,可以删除。取消选中 Generate this association 并单击 Next。
图-19
使用以下屏幕中的默认选项,输入 hr.model 作为 Package 名称,然后单击 Next。
图-20
通过最后一个屏幕,您可以更改实体名称及其属性的名称和类型。在本例中,不必进行更改。单击 Finish 生成 Java 类型。
图-21
右键单击 HRModel 项目并单击 JPA > Show in Entity Editor,查看包含您刚刚创建的实体及其之间关系的图表。
图-22
以下是向导针对 Department 实体生成的源代码:
package hr.model; import java.io.Serializable; import javax.persistence.*; |
向导还生成了 Employee 类:
package hr.model; import java.io.Serializable; import javax.persistence.*; |
在本示例中,由于数据库模式具有关于外键的信息,因此 JPA 向导能够建议关联。但是,有时外键不是由模式显式定义的,您没有权限更改表以添加外键。在这种情况下,您仍然可以使用向导定义表关联。
重要事项!如果模式包含外键,您不必按照该部分其余步骤操作。
假设 HR 示例模式没有外键。在这种情况下,Generate Custom Entities 向导的 Table Associations 列表将为空,如以下屏幕所示。
图-23
要添加关联,您可以单击 + (New Association) 按钮启动 Create New Association 子向导。例如,如果要在此处使用 DEPARTMENT_ID 列定义 EMPLOYEES 和 DEPARTMENTS 之间的关系,按以下屏幕所示选择这两个表并单击 Next。
图-24
然后,单击 Add,选择两个表的 DEPARTMENT_ID 列,然后单击 Next。
图-25
在子向导的 Association Cardinality 屏幕中,选择 Many to one 并单击 Finish。
图-26
之后,可以在主向导中查看该关联。
图-27
总之,通过 Generate Custom Entities 向导,您可以修改建议的关联并将模式中未指定的新关联添加为外键。该方法可以在创建实体时使用。稍后在本文中您将看到,在创建实体后也可以使用 JPA Structure 和 JPA Details 视图定义和修改关联。
从 Java 类创建实体
本文的示例应用程序借助现有数据库启动,该数据库用于生成实体。也可以首先创建 Java 类,然后使用 JPA > Generate DDL... 创建表。第三种方法是将现有类映射到现有表。在本部分中,我们将从 Java 类构建一个新实体,该类将映射到 JOBS 表,其 CREATE 语句如下所示:
CREATE TABLE |
在 hr.model 包中创建一个新类 Job,并粘贴以下代码:
package hr.model; import java.io.Serializable; import java.math.BigDecimal; |
右键单击 HRModel 项目并单击 JPA > Generate Entity from Java Class...单击 Browse 图标,选择 hr.model.Job 类,然后单击 Next。
图-28
确保选择了 hr 连接和 HR 模式,选择 JOBS 表,保留 Primary key property 的 jobId 选择,然后单击 Next。
图-29
验证属性已正确映射到 JOBS 表的列,然后单击 Finish。
图-30
该向导将向 Job 类中添加以下批注。
@Entity() @Table(name="JOBS", schema="HR") public class Job implements Serializable { |
使用 JPA Structure 和 JPA Details
打开 Employee 实体,将 String jobId 字段替换为 Job job。还需要删除 @Column(name="JOB_ID") 批注,将 getJobId() 和 setJobId() 方法替换为 getJob() 和 setJob()。
public class Employee |
Eclipse 将报告错误:Column "job" cannot be resolved。转至右上角的 JPA Structure 视图,右键单击 job 并单击 Map As > Many to One。向导将添加 @ManyToOne 批注。
图-31
您应该在右下角看到 JPA Detail 视图。验证 job 属性仍然正确,在 Fetch 列表中选择 Eager,选中 Join Columns 部分中的 Override Default,单击 Edit 按钮。
图-32
将 Name 域中的 job_JOB_ID 替换为 JOB_ID。单击 OK 之后,您应在 job 属性上方看到 @JoinColumn(name="JOB_ID", referencedColumnName = "JOB_ID") 批注。这将修复上面提示的错误。保存 Job.java 文件。
图-33
右键单击 HRModel 项目并单击 JPA > Show in Entity Editor,查看包含三个实体的已更新图表。
图-34
编辑 XML 配置文件
展开 HRModel 项目的 JPA Content 文件夹,然后双击 persistence.xml。通过配置编辑器,您可以设置该文件的属性。选择 Connection 选项卡,输入 hr 作为数据源。
图-35
然后,按 Ctrl+S 保存包含以下内容的 persistence.xml 文件。
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" |
测试实体
在本部分中,您将使用更多的 OEPE 11g 向导创建无状态会话 bean 和 servlet 来测试先前创建的实体。您还将了解如何在 WebLogic 上部署整个应用程序以及如何从 Eclipse 运行 servlet。
创建会话 Bean
单击 File > New > Project...在 New Project 窗口中,展开 EJB 节点,选择 EJB Project,然后单击 Next。
图-36
输入 HREJB 作为名称,保持 Oracle WebLogic Server v10.3 目标运行时不变,使用 3.0 EJB 版本和 Default Configuration for Oracle WebLogic Server v10.3,选择 Add project to an EAR 复选框,选择 HRApp,然后单击 Next。
图-37
在以下屏幕中,保持默认选项不变,然后单击 Finish。
图-38
右键单击 HREJB 项目并单击 New > Session Bean,输入 hr.ejb 作为 Package 名称,输入 HRBean 作为类名称,使用 Stateless 类型,保留接口的名称 hr.ejb.HRBeanLocal 不变,然后单击 Next。
图-39
不要修改以下屏幕中的默认设置,单击 Finish。
图-40
打开 HREJBClient 项目的 hr.ejb.HRBeanLocal 接口,添加以下方法。
public Employee findEmployee(Integer empId); |
您将收到编译错误:Employee cannot be resolved to a type。要修复该错误,将鼠标移到 Employee 上,单击 Fix Project Setup...
图-41
选择 Add project 'HRModel' to build path of HREJBClient 并单击 OK,然后保存该文件。
图-42
返回 HRBean.java 文件,将鼠标移到类名称(应标有红色下划线)上,然后单击 Add unimplemented methods…
图-43
将鼠标移到 findEmployee() 方法的 Employee 返回类型上,单击 Fix Project Setup...,选择 Add project 'HRModel' to build path of HREJB,然后单击 OK。然后,在 HRBean 类的开头添加以下代码行:
@PersistenceContext private EntityManager em; |
将鼠标移到 @PersistenceContext 上,单击 Import 'PersistenceContext' (javax.persistence)。将鼠标移到 EntityManager 上,单击 Import 'EntityManager' (javax.persistence)。接下来,将 return null; 替换为 findEmployee() 方法中的以下代码,并保存 HRBean 类。
return em.find(Employee.class, empId); |
保存文件之后,您应该在 Problems 视图中看到没有错误。以下是 HRBean 类的完整源代码。
package hr.ejb; import hr.model.Employee; |
创建测试 Servlet
单击 File > New > Project...在 New Project 窗口中,展开 Web 节点,选择 Dynamic Web Project,然后单击 Next。
图-44
输入 HRTest 作为 Web 项目的名称,选择 Add project to an EAR 复选框,选择 HRApp,然后单击 Next。
图-45
在以下屏幕中,保持默认选项不变,然后单击 Finish。
图-46
右键单击 HRTest 项目并单击 New > Servlet,输入 hr.test 作为 Package 名称,输入 HRServlet 作为类名称,然后单击 Finish。
图-47
在 HRServlet 类的开头添加以下两行代码。
@EJB(name="HRBean") private HRBeanLocal hrBean; |
将鼠标移到 @EJB 上,单击 Import 'EJB' (javax.ejb)。将鼠标移到 HRBeanLocal 上,单击 Fix Project Setup...,选择 Add project 'HREJBClient' to build path of HRTest,单击 OK,然后保存文件。然后,在 HRServlet 的 doGet() 方法中添加以下代码。
protected void doGet( |
将鼠标移到 PrintWriter 上,单击 Import 'PrintWriter' (java.io)。将鼠标移到 Employee 上,单击 Fix Project Setup...,选择 Add project 'HRModel' to build path of HRTest,单击 OK,然后保存 HRServlet.java 文件。
展开 HRTest > Java Resources > src > hr.test,右键单击 HRServlet.java 并单击 Run As > Run on Server,然后单击 Next。
图-48
查看部署的应用程序,然后单击 Finish。
图-49
您应该看到以下屏幕。
图-50
在 Eclipse 中 URL 的结尾添加 ?emp=101,然后按 Enter 键。您将看到下面的屏幕。
图-51
总结
在本文中,您了解了如何使用 Oracle Enterprise Pack for Eclipse (OEPE) 和 WebLogic 构建、部署和测试 Java EE 应用程序。我们主要讨论了 JPA 相关特性和向导,通过这些特性和向导,您可以从表或 Java 类中创建实体,然后在易于使用的编辑器和属性表中修改它们。
Andrei Cioroianu 是 Devsphere 的创始人,该公司主要提供 Java EE 开发和 Web 2.0/Ajax 咨询服务。他自 1997 年开始使用 Java 和 Web 技术,有着 10 多年的解决复杂技术问题和全程管理商业产品、定制应用程序和开源框架的专业经验。您可以通过