在本教程中,您将通过开发会话 bean 和实体 bean 实现一个持久性模型。这些 bean 使用了 EJB 3.0 批注和 POJO(传统 Java 对象)模型持久性。Enterprise JavaBean (EJB) 是封装了业务逻辑的服务器端组件。您将使用 Entity Manager API 来创建、更新、删除和查询 POJO 持久模型。
作为本教程的一部分,您需要创建一个数据库连接和一个 OC4J 应用程序连接,以在其中运行一个示例 Java 客户端。完成之后,再将应用程序部署到任何 Java EE 容器(例如,Oracle 应用服务器 10g)以进行企业范围的访问。
会话外观为客户端对象提供了底层 EJB(企业 Java Bean)的统一接口。客户端只与外观交互作用,外观驻留在服务器上,并调用相应的 EJB 方法。在本部分中,您将创建一个会话 bean,用于实现一个查找员工和部门记录的方法。
| 1. |
在 Applications Navigator 中右键单击 EJB_Project 节点,从上下文菜单中选择 New 选项。打开 Business Tier 类别,选择 Session Bean 项。单击 OK。
|
| 2. |
在 Create Enterprise JavaBean 向导的 Welcome 页面上单击 Next。在 step 1 of 4 中,输入 HRAppFacade 作为 EJB 名称。保留选项不变,然后单击 Next。
|
| 3. |
在 Step 2 of 4 中,选中所有实体方法,然后单击 Next。
该项目中的任何实体都会在树控件中显示为节点。可以选择该复选框来包括该实体公开的所有实体方法,或者扩展这些节点并选择一个方法子集。请注意,命名的查询显示为可公开的方法。
|
| 4. |
在 Step 3 of 4 中,确保 Bean Class 的完整名称为 buslogic.HRAppFacadeBean,然后单击 Next。
|
| 5. |
在 step 4 of 4 中,取消选中 Implement a Local Interface 选项,以便只选中 Implement a Remote Interface 选项。单击 Next,然后单击 Finish。该远程接口用于运行在单独虚拟机(如 Java 客户端)上的客户端应用程序,而本地接口用于运行在相同虚拟机(如 Web 客户端)上的客户端应用程序。
|
| 6. |
Applications Navigator 应如下所示:
如果不同,则选择 EJB_Project 节点,然后从 View 菜单中选择 Refresh (View | Refresh) 选项。
|
| 7. |
该会话 bean 由两个文件组成:HRAppFacadeBean — 包含会话 Bean 代码。HRAppFacade — 描述远程客户端的 Bean 的功能。
打开 Structure 窗格 (View | Structure) 并在 Applications Navigator 中选择 buslogic.HRAppFacadeBean。在 Structure 窗格中扩展 Sources 节点。Structure 窗格应如下所示,显示 HRAppFacade 类:
|
| 8. |
在 Structure 窗格中,双击 HRAppFacadeBean 编辑编码,并添加以下方法声明:
public void addDepartment(String department_name, long location_id) throws NamingException { Departments dept = new Departments(); dept.setDepartmentName(department_name); dept.setLocationId(location_id); this.getEntityManager().persist(dept); }
public String getEmail(long empid) { Employees emp = (Employees)this.em.createNamedQuery("Employees.findById").setParameter("empid",empid).getSingleResult(); return emp.getEmail(); }
按下 Alt + Enter 添加所建议的导入语句。
|
| 9. |
您现在需要通过新创建的方法的远程接口公开方法声明。在 Structure 窗格中,单击 HRAppFacadeBean 接口并扩展 Methods 节点。右键单击 addDepartment 方法并从上下文选择 Properties。
在 Bean Method Details 对话框中,选中 Expose through Remote interface 复选框将该方法声明添加到远程接口。
单击 OK。
|
| 10. |
为 getEmail() 重复相同操作。在 Structure 窗格中,右键单击 getEmail 方法并从上下文选择 Properties。
在 Bean Method Details 对话框中,选中 Expose through Remote interface 复选框将该方法声明添加到远程接口。
单击 OK。
|
| 11. |
右键单击 EJB_Project 项目,选择 Make 选项编译该项目。
|
| 12. |
确认 Messages - Log 窗口没有报告任何错误。
|
您需要创建测试客户端,而且在运行它之前必须使用 JDeveloper 提供的 OC4J 服务器运行 HRAppFacadeBean。使用这一个服务器,可以在 JDeveloper 内部创建并测试 J2EE 应用程序,从而免除了在开发/测试阶段运行外部服务器的必要。
| 1. |
下面将创建一个测试客户端。
在 Applications Navigator 中,右键单击 HRAppFacadeBean 并选择 New Sample Java Client。
|
| 2. |
在 Create Sample Java Client 对话框中,单击 New Project 按钮在单独项目中创建客户端类。
在 Create Project 对话框中,输入 Client 作为项目名,并单击 OK。
返回 Create Sample Java Client 对话框,将 Client Class Name 域设置为 client.HRAppFacadeClient,并选择 Connect to OC4J Embedded in JDeveloper。单击 OK。
|
| 3. |
双击 HRAppFacadeClient 节点在源代码编辑器中打开该文件。在 Main 方法中,注释掉对 findAllDepartments 和 findAllEmployees 方法的调用。
// System.out.println( hRAppFacade.queryDepartmentsFindAll( ) ); // System.out.println( hRAppFacade.queryEmployeesFindAll( ) );
|
| 4. |
在 HRAppFacadeClient 中,添加下列语句使用 addDepartments() 方法创建一个新部门。
String department_name = "IT Administration 12"; long location_id = 1500; hRAppFacade.addDepartment( department_name, location_id );
|
| 5. |
指定您想查看其电子邮件的员工的员工 ID。例如:
long empid = 100;
调用 getEmail() 方法,打印参数 employee_id 的电子邮件:
System.out.println(hRAppFacade.getEmail( empid ));
|
| 6. |
在 Applications Navigator,右键单击 HRApp 并选择 Make。
|
| 7. |
在 Applications Navigator,右键单击 HRAppFacadeBean 并选择 Run。
这将运行嵌入的服务器并部署 HRAppFacadeBean。
|
| 8. |
在 Applications Navigator 中,右键单击 HRAppFacadeClient 文件并选择 Run。
|
| 9. |
确保返回您指定客户 (100) 的电子邮件 (SKING)。
|
| 10. |
确保使用您为该 ID 指定的序列将一个新的部门添加到表中。在 Connection 页面上,展开 Database > HR > Tables > DEPARTMENTS,在编辑器中单击 Data 选项卡。
|