Entity Bean 概要 EJB 3.0 コース 第7回 1 ここでの目標 Entity Bean の基本事項について理解する 2 Entity Beanとは? 3 Entity Bean とは? 「永続化」されているデータとの対応に用い るもの O/Rマッピング リレーショナルデータベースの1行と、Entity Bean の一つのインスタンスが対応する リレーショナルデータベースと Entity Bean の間で同期が行われる 4 実習環境の構築 5 HSQLDBの利用設定 (1) 本講習では、リレーショナルデータベースとし て HSQLDB を用います。 HSQLDBをダウンロード HSQLDBのlibディレクトリにある hsqldb.jar を%ORACLE_HOME%/j2ee/home/applib にコピー 6 HSQLDBの利用設定 (2) %ORACLE_HOME%/j2ee/home/config/datasources.xml にHSQLDBの情報を追加 <connection-pool name="HSQLDB Connection Pool"> <connection-factory factory-class="org.hsqldb.jdbcDriver" user="sa” password="" url="jdbc:hsqldb:hsql://localhost/"> </connection-factory> </connection-pool> <managed-data-source name="HSQLDB Data Source" connection-pool-name="HSQLDB Connection Pool" jndi-name="jdbc/HsqldbDS"/> 7 HSQLDBの利用設定 (3) %ORACLE_HOME%/j2ee/home/config/applicati on.xml を編集 デフォルトのデータソースを指定 <orion-application xmlns:xsi="http://www.w3.org/2001/XMLSchem a-instance" xsi:noNamespaceSchemaLocation="http://xmln s.oracle.com/oracleas/schema/orionapplication-10_0.xsd" autocreate-tables="true" default-data-source="jdbc/HsqldbDS" 8 アプリケーションサーバを起動 (あるいは再 起動) します。 9 テーブルの作成 (1) HSQL Database Manager を起動して、 テーブルを作成します。 howtoejb30entity の scripts フォルダにある table.sql を編集 10 テーブルの作成 (2) create table emp ( empno DECIMAL(4) primary key, ENAME VARCHAR(10), SAL DECIMAL(10,2) ); 11 アプリケーションのデプロイと実行 ant コマンドでコンパイルとデプロイを実行 クライアントプログラムの実行には、次のように、適 当なデータを設定してください。 ant run -Dempno=10 -Dname=tomoharu -Dsal=10000 データがHSQLDBに反映されたかどうか確かめま す。 select * from emp; 12 Entity Bean の作成 13 Employee.java (1) // Entity Bean である @Entity // EMP テーブルと関連づけられる @Table(name = "EMP") public class Employee implements java.io.Serializable { …… } 14 Employee.java (2) // empNoプロパティは Entity BeanのIDである。 @Id // empNo プロパティは、テーブル中の // EMPNO項目とマッピングしている。 // また、主キーである。 @Column(name="EMPNO", primaryKey=true) public int getEmpNo() {return empNo; } ...... 15 Employee.java (3) // テーブル中の各項目に対応する // setter と getter (= プロパティ) を用意 // プロパティとテーブル中の項目名が同一の場合は // アノテーションをつける必要はない public void setEmpNo(int empNo) {...} public String getEname() {...} public void setEname(String eName) {...} public double getSal() {...} public void setSal(double sal) {...} 16 インピーダンス・ミスマッチと Annotation(1) リレーショナルデータベースのテーブル中の 情報は、Annotation に記述されている。 テーブル名、主キー、項目名、一対多の関係な ど 旧来の EJB では、こうした情報は DD ファイル に記述されていた。 17 インピーダンス・ミスマッチと Annotation(2) Java プログラムの持つ情報 < テーブルの情報 インピーダンス・ミスマッチ Javaプログラムの持つ情報 + Annotation の情報 = テーブルの情報 インピーダンス・ミスマッチの解消 18 Session Façade と Entity Manager 19 Session Facade クライアントが Entity Bean を直接操作する のではなく、Stateless Session Bean からア クセスできるようにする。 データベースに関連するさまざまな処理を隠 蔽する これが「Session Façade パターン」 20 インタフェースの準備 @Remote public interface EmployeeFacade { // 従業員の情報をデータベースに追加 void addEmployee( int empNo, String name, double salary); // 主キーから対応する従業員のデータを取得 Employee findEmployeeByEmpNo(int empNo); } 21 Stateless Session Bean を 用意 (1) import javax.persistence.EntityManager; @Stateless public class EmployeeFacadeBean implements EmployeeFacade { @Inject private EntityManager em; public Employee findEmployeeByEmpNo(int empNo) {...} public void addEmployee(int empNo, String n, double sal) {...} } 22 EntityManager と @Inject @Inject private EntityManager em; EntityManager は、データの永続管理を受け持つ オブジェクト。データベースと接続して、さまざまな 処理を行う。 @Inject は、Dependency Injection (依存性注入) を行うためのアノテーション。EntityManager は、コ ンテナによって依存性注入される。 23 EntityManager#find public Employee findEmployeeByEmpNo(int empNo) { return ((Employee) em.find("Employee",empNo)); } EntityManager の find メソッドは、データベースから empNo という主キーで指定したデータを検索し、検索結果 として Employee オブジェクトを返す。 24 EntityManager#persist public void addEmployee(int empNo, String eName, double sal) { if (emp == null) emp = new Employee(); emp.setEmpNo(empNo); emp.setEname(eName); emp.setSal(sal); em.persist(emp); } EntityManager の persist メソッドで、Entity Bean を永続 化している。つまり、データをデータベースで管理するように している。 25 クライアントのプログラム 26 クライアントプログラム // JNDIから Session Facade を取得 Context context = new InitialContext(); EmployeeFacade ef = (EmployeeFacade) context .lookup("java:comp/env/ejb/EmployeeFacade"); // Entity Manager を使ってデータの操作 ef.addEmployee(empNo, name, sal); Employee emp2 = ef.findEmployeeByEmpNo(empNo); 27 課題 28 課題 (1) 次のテーブルのデータをアクセスする Entity Bean を作成してください。 create table account ( id DECIMAL(4) primary key, name VARCHAR(10), account DECIMAL(10,2) ); 29 課題 (2) (1)の Entity Bean を用いて、次の機能を持 つ Session Façade を作成してください。 データの登録 主キーによるデータの検索 30
© Copyright 2024 ExpyDoc