300 likes | 567 Views
Entity Bean 概要. EJB 3.0 コース 第 7 回. ここでの目標. Entity Bean の基本事項について理解する. Entity Bean とは?. Entity Bean とは?. 「永続化」されているデータとの対応に用いるもの O/R マッピング リレーショナルデータベースの1行と、 Entity Bean の一つのインスタンスが対応する リレーショナルデータベースと Entity Bean の間で同期が行われる. 実習環境の構築. HSQLDB の利用設定 (1).
E N D
Entity Bean 概要 EJB 3.0 コース 第7回
ここでの目標 • Entity Bean の基本事項について理解する
Entity Bean とは? • 「永続化」されているデータとの対応に用いるもの • O/Rマッピング • リレーショナルデータベースの1行と、Entity Bean の一つのインスタンスが対応する • リレーショナルデータベースと Entity Bean の間で同期が行われる
HSQLDBの利用設定 (1) • 本講習では、リレーショナルデータベースとして HSQLDB を用います。 • HSQLDBをダウンロード • HSQLDBのlibディレクトリにある hsqldb.jar を%ORACLE_HOME%/j2ee/home/applib にコピー
HSQLDBの利用設定 (2) • %ORACLE_HOME%/j2ee/home/config/data-sources.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"/>
HSQLDBの利用設定 (3) • %ORACLE_HOME%/j2ee/home/config/application.xml を編集 • デフォルトのデータソースを指定 <orion-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-application-10_0.xsd" autocreate-tables="true" default-data-source="jdbc/HsqldbDS"
アプリケーションサーバを起動 (あるいは再起動) します。
テーブルの作成 (1) • HSQL Database Manager を起動して、テーブルを作成します。 • howtoejb30entity の scripts フォルダにあるtable.sql を編集
テーブルの作成 (2) create table emp ( empno DECIMAL(4) primary key, ENAME VARCHAR(10), SAL DECIMAL(10,2) );
アプリケーションのデプロイと実行 • ant コマンドでコンパイルとデプロイを実行 • クライアントプログラムの実行には、次のように、適当なデータを設定してください。 ant run -Dempno=10 -Dname=tomoharu -Dsal=10000 • データがHSQLDBに反映されたかどうか確かめます。 • select * from emp;
Employee.java (1) // Entity Bean である @Entity // EMP テーブルと関連づけられる @Table(name = "EMP") public class Employee implements java.io.Serializable { …… }
Employee.java (2) // empNoプロパティは Entity BeanのIDである。 @Id // empNo プロパティは、テーブル中の // EMPNO項目とマッピングしている。 // また、主キーである。 @Column(name="EMPNO", primaryKey=true) public int getEmpNo() {return empNo; } ......
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) {...}
インピーダンス・ミスマッチとAnnotation(1) • リレーショナルデータベースのテーブル中の情報は、Annotation に記述されている。 • テーブル名、主キー、項目名、一対多の関係など • 旧来の EJB では、こうした情報は DD ファイルに記述されていた。
インピーダンス・ミスマッチとAnnotation(2) Java プログラムの持つ情報 < テーブルの情報 Javaプログラムの持つ情報 + Annotation の情報 = テーブルの情報 インピーダンス・ミスマッチ インピーダンス・ミスマッチの解消
Session Facade • クライアントが Entity Bean を直接操作するのではなく、Stateless Session Bean からアクセスできるようにする。 • データベースに関連するさまざまな処理を隠蔽する • これが「Session Façade パターン」
インタフェースの準備 @Remote public interface EmployeeFacade { // 従業員の情報をデータベースに追加 void addEmployee( int empNo, String name, double salary); // 主キーから対応する従業員のデータを取得 Employee findEmployeeByEmpNo(int empNo); }
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) {...} }
EntityManager と @Inject @Inject private EntityManager em; • EntityManager は、データの永続管理を受け持つオブジェクト。データベースと接続して、さまざまな処理を行う。 • @Inject は、Dependency Injection (依存性注入)を行うためのアノテーション。EntityManager は、コンテナによって依存性注入される。
EntityManager#find public Employee findEmployeeByEmpNo(int empNo) { return ((Employee) em.find("Employee",empNo)); } • EntityManager の find メソッドは、データベースからempNo という主キーで指定したデータを検索し、検索結果として Employee オブジェクトを返す。
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 を永続化している。つまり、データをデータベースで管理するようにしている。
クライアントプログラム // 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);
課題 (1) • 次のテーブルのデータをアクセスする Entity Bean を作成してください。 create table account ( id DECIMAL(4) primary key, name VARCHAR(10), account DECIMAL(10,2) );
課題 (2) • (1)の Entity Bean を用いて、次の機能を持つ Session Façade を作成してください。 • データの登録 • 主キーによるデータの検索