J2EE と EJB

EntityManager と EJB QL
EJB 3.0 コース
第8回
1
ここでの目標

Entity Manager の使いかた、とりわけ EJB
QL について理解する。
2
EntityManagerの利用
3
EntityManager と @Inject
@Inject
private EntityManager em;


EntityManager は、データの永続管理を受け持つ
オブジェクト。データベースと接続して、さまざまな
処理を行う。
@Inject は、Dependency Injection (依存性注入)
を行うためのアノテーション。EntityManager は、コ
ンテナによって依存性注入される。
4
EntityManager#find
public Employee findEmployeeByEmpNo(int empNo) {
return ((Employee) em.find("Employee",empNo));
}

EntityManager の find メソッドは、データベースか
らempNo という主キーで指定したデータを検索し、
検索結果として Employee オブジェクトを返す。
5
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 を永続
化している。つまり、データをデータベースで管理するように
している。
6
EntityManager#remove
@Stateless public class EmployeeDemoSessionEJB
implements EmployeeDemoSession {
public void removeEmployee(Integer employeeId) {
Employee employee =
(Employee)em.find("Employee", employeeId);
em.remove(employee);
}
}

EntityManager の remove メソッドで、データベースで管理され
ているオブジェクトを削除できる。
7
データベースの更新
Employee emp3 =
ef.findEmployeeByEmpNo(empNo);
emp3.setSal(100000);

Entity Bean のプロパティの内容を変化させ
ると、その内容がデータベースに反映される。
8
EJB QL
9
EJB QL とは何か
EJBでデータベースを操作するためのクエ
リー言語
 データベースに依存しないかたちでクエリー
を記述できる

10
EJB QL のパターン
select …
from …
where …

EntityManager の createQuery,
createNamedQuery といったメソッドから利
用する。
11
createQueryとEJB-QLの利用
public Collection findAllEmployees() {
Collection employees = em.createQuery(
"SELECT employee FROM Employee employee")
.getResultList();
return employees;
}
public Collection findEmployeesByLastName(String lastName) {
Collection employees = em.createQuery(
"SELECT employee
FROM Employee employee
WHERE employee.lastName = :lastname")
.setParameter("lastname", lastName).getResultList();
return employees;
}
12
createQueryとEJB-QLの利用
public Collection findManyProjectsByQuery(Vector params) {
Collection projects = em.createQuery(
"SELECT project FROM Project project
WHERE project.name LIKE :projectName")
.setParameter("projectName", params.firstElement())
.getResultList();
return projects;
}
public int changeCityName(String oldName, String newName) {
StringBuffer buffer = new StringBuffer();
buffer.append("UPDATE Address address SET address.city = '");
buffer.append(newName);
buffer.append("' WHERE address.city = '");
buffer.append(oldName);
buffer.append("'");
String ejbqlString = buffer.toString();
return em.createQuery(ejbqlString).executeUpdate();
13
}
NamedQueryの利用
@Entity
@Table(name="EJB_PROJECT")
@NamedQuery(
name="findProjectByName",
queryString="SELECT project FROM Project project
WHERE project.name = :name"
)
public class Project implements Serializable {…..}
public Project findProjectByName(String name) {
Project proj =
(Project)em.createNamedQuery("findProjectByName")
.setParameter("name", name).getSingleResult();
proj.getTeamLeader();
return proj;
}
14
課題 (1)

Entity Bean のサンプルに、「指定したIDを
持つ従業員の給料を100上げる」という機能
を追加してください。
15
課題 (2)
図書館の本の検索アプリケーションを作成し
ます。例えば “Java” を引数に与えた
ら、”Java” という文字がタイトルに含まれる
本のリストを出力するような機能を持つアプ
リケーションを作成してください。
 本のデータはダウンロードできます。

16