J2EE と EJB

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