Kuina-Dao入門(PDF)

2007年5月27日 ... SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((emp .sal. > ... . SELECT e FROM Emp e INNER JOIN e.mgr m. WHERE ..... Al...

3 downloads 375 Views 374KB Size
Seasar Conference 2007 Spring

Kuina-Dao入門 2007.05.27 中村年宏

Seasar Conference 2007 Spring

1 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

自己紹介 • 名前:中村年宏 – ブログ:http://d.hatena.ne.jp/taedium/

• コミッタとして参加しているプロジェクト – – – – – –

S2Container Kuina-Dao S2Hibernate S2TopLink (sandboxプロジェクト) S2OpenJPA (sandboxプロジェクト) S2Cayenne (sandboxプロジェクト)

Seasar Conference 2007 Spring

2 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

アジェンダ • • • •

Kuina-DaoとJPA Kuina-DaoとS2Dao Kuina-Daoの使いどころ Kuina-Daoの使いどころ アドバンスド

• ロードマップ

Seasar Conference 2007 Spring

3 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-DaoとJPA

Kuina-DaoとJPA

Seasar Conference 2007 Spring

4 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

JPAとは • Javaの標準O/Rマッピング仕様 – Java Persistence API – Java SE環境で利用可能

• 代表的なJPA実装プロダクト – Hibernate – TopLink Essentials

• 特徴 – – – –

Java SE 5.0が必須 アノテーションによるマッピング 永続コンテキスト 標準 • ツールのサポートを受けやすい • 情報量が豊富 • 導入の障壁が低い

Seasar Conference 2007 Spring

5 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoとは • Java Persistence API(JPA)を使いやすくするためのDAOフ レームワーク – 「くいなだお」 – http://kuina.seasar.org/ja/index.html – 現在のバージョンは1.0

• JPAの実装であるHibernateやTopLink Essentialsと組み合わ せて使う – 今後はOpenJPAやCayenneとの連携もサポート予定 – Kuina-Coreは現在構想中

• メリット – コードの削減 Seasar Conference 2007 Spring

6 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

コード例 Kuina-Daoを利用する場合 public interface EmpDao { @Orderby(“empNo”) Emp findByEmpNo(Integer empNo_GE); }

Kuina-Daoを利用しない場合(JPAを直接利用する場合) public class EmpDao { @PersistenceContext private EntityManager em; public Emp findByEmpNo(Integer empNo) { return (Emp)em.createQuery(“SELECT e FROM Emp e WHERE e.empNo >= :empNo” ORDER BY empNo) .setParameter(" empNo ", empNo) .getSingleResult(); } } Seasar Conference 2007 Spring

7 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

コード例 Kuina-Daoを利用する場合 public interface EmpDao { @Orderby(“empNo”) List findByEmpNo(Integer empNo_GE); }

Kuina-Daoを利用しない場合(JPAを直接利用する場合) public class EmpDao { @PersistenceContext private EntityManager em; public List findByEmpNo(Integer empNo) { return (Emp)em.createQuery(“SELECT e FROM Emp e WHERE e.empNo >= :empNo” ORDER BY empNo) .setParameter(" empNo ", empNo) .getResultList(); } } Seasar Conference 2007 Spring

8 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの特徴 必要最小限のJavaコード

1. –

インターフェースだけが必要で実装クラスは不要 •

– –

抽象クラスを用意すれば独自ロジックを書ける

メソッド名やパラメータ名の命名規約を利用 必要に応じてアノテーションを使用可

問い合わせを簡略化

2. –

JPQLの自動生成 •



動的な問い合わせに対応

SQLの動的な問い合わせに対応

パラメータ名をKuina-Daoで利用するためにDiiguを使用

3. –

DiiguはAnt、Maven、Eclipse pluginで利用可能

Seasar Conference 2007 Spring

9 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの位置づけ

Kuina-Dao

S2Hibernate -JPA

S2TopLink -JPA

S2OpenJPA (開発中)

S2Caynenn -JPA (開発中) Kuina-Core (構想中)

TopLink

Hibernate

Essentials

OpneJPA

Cayenne

(Seasarプロジェクト外のプロダクト) Seasar Conference 2007 Spring

10 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの仕組み – 簡略版 インターセプト

Kuina-Dao

インターフェース

アプリ

JDBC

DB

JPA実装 エンティティの取 得・更新 DTOの取得

Seasar Conference 2007 Spring

11 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの仕組み – 詳細版 インターセプト

Kuina-Dao

DTOの取得

Seasar Conference 2007 Spring

JDBC

抽象クラス

エンティティの取 得・更新

インターフェース

アプリ

.sql

DB

JPA実装 永続コンテキスト

12 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ • Kuina-Daoを使った問い合わせ – – – – – –

引数を条件とする検索 エンティティのプロパティを条件とする検索 DTOのプロパティを条件とする検索 JPQLによる検索 SQLによる検索 Criteriaによる検索

Seasar Conference 2007 Spring

13 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - エンティティクラスの構成 • エンティティクラスの構成 従業員エンティティ

部署エンティティ

Emp

Dept

* id : Integer empNo : Integer empName : String hireDate : Date sal : BigDecimal * dept : Dept mgr : Emp versionNo : Integer

0..1

Seasar Conference 2007 Spring

1

id : Integer deptNo : Integer deptName :String loc : String emps : Set versionNo : Integer

14 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - 引数を条件とする検索 1.引数名は検索対象のプロパティ名 + 検索条件を表すサフィックスとする。 @Orderby("id") public List findBySal(BigDecimal sal_GE); 実行されるJPQL SELECT emp FROM Emp AS emp WHERE (emp.sal >= :sal_GE) ORDER BY emp.id 2.関連先のエンティティのプロパティを検索条件に含めることもできる。 @Orderby("id") public List findBySalDeptName(BigDecimal sal_GE, String dept$deptName); 実行されるJPQL SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((emp.sal >= :sal_GE) AND (dept.deptName = :dept$deptName)) ORDER BY emp.id 3.INを使った検索条件。 @Orderby("id") public List findByEmpNoArray(Integer[] empNo_IN); 実行されるJPQL SELECT emp FROM Emp AS emp WHERE emp.empNo IN (:empNo_IN0, :empNo_IN1, :empNo_IN2, :empNo_IN3, :empNo_IN4) ORDER BY emp.id Seasar Conference 2007 Spring

15 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - エンティティのプロパティを条件とする検索 引数には検索条件を設定したエンティティを受ける。 @Orderby("id") public List findByExample(Emp emp); Emp emp = new Emp(); emp.setEmpNo(empNo); emp.setEmpName(empName); emp.setHiredate(hiredate); emp.setSal(sal); Emp mgr = new Emp(); mgr.setEmpName(mgrName); emp.setMgr(mgr); Dept dept = new Dept(); dept.setDeptName(deptName); emp.setDept(dept);

使用例

empDao.findByExample(Emp emp); 実行されるJPQL SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((emp.empName = :empName) AND (emp.sal = :sal) AND (dept.deptName = :dept$deptName)) ORDER BY emp.id Seasar Conference 2007 Spring

16 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - DTOのプロパティを条件とする検索 引数には検索条件を設定したDTOを受ける。

@Orderby("id") public List findByDto(EmpConditionDto dto); public class EmpConditionDto { private String empName_STARTS; private BigDecimal sal_GE; private String dept$deptName_CONTAINS; // getter, setter }

DTOを定義。 プロパティ名はエンティティ のプロパティ名 + 検索条件 を表すサフィックスとする。

EmpConditionDto dto = new EmpConditionDto(); dto.setEmpName_STARTS(empName); dto.setSal_GE(sal); dto.setDept$deptName_CONTAINS(deptName);

使用例 empDao.findByDto(EmpConditionDto dto); 実行されるJPQL SELECT emp FROM Emp AS emp INNER JOIN emp.dept AS dept WHERE ((dept.deptName LIKE :dept$deptName_CONTAINS) AND (emp.empName LIKE :empName_STARTS) AND (emp.sal >= :sal_GE)) ORDER BY emp.id Seasar Conference 2007 Spring

17 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - JPQLによる検索 名前つきクエリを呼び出す。

public List findByEmpName(String empName); SELECT e FROM Emp e INNER JOIN e.mgr m WHERE e.empName = :empName OR m.empName = :empName ORDER BY e.id

Seasar Conference 2007 Spring

EmpOrm.xmlに名 前つきクエリを定義 しておく

18 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - SQLによる検索 外部ファイルに定義したSQLをDTOにマッピングする。

public List getSalSum(); public class SalSumDto { private String deptName; private BigDecimal sal; }

DTOを定義。

SELECT d.DEPT_NAME deptName, SUM(e.SAL) sal FROM Dept d INNER JOIN Emp e ON d.ID = e.DEPT_ID GROUP BY d.DEPT_NAME ORDER BY d.ID

Seasar Conference 2007 Spring

EmpDao_getSal Sum.sqlにSQLを 定義しておく

19 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

デモ - Criteriaによる検索 外部ファイルに定義したSQLをDTOにマッピングする。 public List findBySal(BigDecimal from, BigDecimal to); import static org.seasar.kuina.dao.criteria.CriteriaOperations.*; public abstract class Emp2DaoImpl implements Emp2Dao { @PersistenceContext private EntityManager em;

}

public List findBySal(BigDecimal from, BigDecimal to) { return select().from(Emp.class,"e").where(between("e.sal",from,to)) .orderby("e.id").getResultList(em); Javaクラスでクエ } リを組み立てる

実行されるJPQL SELECT e FROM Emp AS e WHERE (e.sal BETWEEN 1000 AND 2000) ORDER BY e.id

Seasar Conference 2007 Spring

20 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-DaoとJPA – まとめ

Kuina-Dao + JPA実装

JPA実装を直接利用

1

静的な問い合わせ





2

動的な問い合わせ DTOの取得



×





3

JPA実装 実装を 実装を直接利用するよりも 直接利用するよりも Kuina-Daoと と組み合わせて使用 わせて使用した 使用した方 した方が便利! 便利! でも、そもそもJPAって実際に有用なの?

Seasar Conference 2007 Spring

21 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-DaoとS2Dao

Kuina-DaoとS2Dao

Seasar Conference 2007 Spring

22 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの仕組み インターセプト

Kuina-Dao

DTOの取得

Seasar Conference 2007 Spring

JDBC

抽象クラス

エンティティの取 得・更新

インターフェース

アプリ

.sql

DB

JPA実装 永続コンテキスト

23 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

S2Daoの仕組み インターセプト

.sql

Seasar Conference 2007 Spring

S2-Dao

JDBC

DB

抽象クラス

DTOの取得・更新

インターフェース

アプリ

24 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-DaoとS2Daoの関係 • ともにDaoフレームワーク – Kuina-DaoはJPAベース • 問い合わせはJPQLもしくはSQL • マッピングはJPAの標準仕様 • 問い合わせの実行やマッピングはJPA実装が行う

– S2DaoはJDBCベース • 問い合わせはSQL • マッピングはS2Daoの独自仕様 • 問い合わせの実行もマッピングもS2Daoが行う

• アーキテクチャ上、S2Daoに対応するのはKuina-Dao単体では なく、Kuina-Dao + JPA実装 • Kuina-DaoはS2Daoの後継ではない Seasar Conference 2007 Spring

25 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

(Kuina-Dao + JPA実装) VS. S2Dao •

プロジェクトへ適用する場合に、どちらがより適してい るかの観点で比較

Seasar Conference 2007 Spring

26 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 1 – 人気(ダウンロード数) 1000 900 800 700 600 Kuina-Dao S2Dao

500 400 300 200

ここでのダウンロード 数とは配布zipファイ ルに対するアクセス 数です。

100 0

/5 07 20

/4 07 20

/3 07 20

/2 07 20

/1 07 20

2 /1 06 20

Maven2やDoltengに よる利用数は含めて いません。

5月13日時点のデータ Seasar Conference 2007 Spring

27 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 1 – 人気(ダウンロード数)

1 人気 (ダウンロード数 ダウンロード数)

Kuina-Dao + JPA実装

S2Dao

×



2 3 4 5 6 7 8

Seasar Conference 2007 Spring

28 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 2 – 学習コスト • S2Daoの学習コストは低い – – – –

SQLの知識 SQLコメント メソッドの命名規則 アノテーション

• Kuina-DAO自体の学習コストは並だが… – JPAの知識 • 永続コンテキストとエンティティのライフサイクル

– – – – –

SQLの知識 SQLコメント アノテーション メソッドの命名規則 パラメーターの命名規約

Seasar Conference 2007 Spring

29 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 2 – 学習コスト 1 人気(ダウンロード数)

2 学習コスト 学習コスト

Kuina-Dao + JPA実装

S2Dao

×



×



3 4 5 6 7 8

Seasar Conference 2007 Spring

30 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 3 – SQLの利用 • SQLは既存の資産 – 実際のSQL – SQLの知識 – SQLを中心とした開発に対する経験

• S2Daoの場合 – SQLをフル活用できる • SQLを外部ファイルに記述しDTOにマッピングするだけ

• Kuina-Daoの場合 – SQLをサポートするが、主役はJPAでのデータアクセス – 一部の複雑なアクセスはJPAを経由しないでSQLで行うのがよい • S2Daoと同様外部ファイルに記述したSQLをDTOにマッピングできる Seasar Conference 2007 Spring

31 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 3 – SQLの利用 Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×







3 SQLの の利用 4 5 6 7 8

Seasar Conference 2007 Spring

32 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 4 – チューニング • JPAを使う/使わないでチューニングの対象は異なる • S2Daoの場合 – SQL

• JPAの場合 – マッピング – フェッチ – 永続コンテキスト

Seasar Conference 2007 Spring

33 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 4 – チューニング Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用









4 チューニング 5 6 7 8

Seasar Conference 2007 Spring

34 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 5 – レガシーなERモデルとの相性 • ここでの「レガシーなERモデル」の定義 – 複合主キーを利用している – トリガーを多用している

• S2Daoの場合 – すべてSQLで解決できるので相性は良い

• JPAの場合 – JPAでは複合主キーを使う/使わないでマッピングが異なるので注意 • @EmbeddedId、 @JoinColumns • クラス数が増える、コードが増える

– トリガーでDBが更新されると、DBとJPAの永続コンテキストがずれる • EntityManager#refresh()

Seasar Conference 2007 Spring

35 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 5 – レガシーなERモデルとの相性 Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用





4 チューニング









5 レガシーな モ レガシーなERモ デルとの デルとの相性 との相性 6 7 8

Seasar Conference 2007 Spring

36 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 6 – マッピング • S2Daoの場合 – 独自のアノテーションと規約でマッピング • フラットなDTOにマッピングされる

– リレーションシップのマッピング • Many to One • 双方向関連や遅延ローディングの機能はない

• JPAの場合 – 標準のアノテーションでマッピング • 階層化されたデータ構造にマッピングされる

– リレーションシップのマッピング • • • • •

Many to One One to Many One to One Many to Many 双方向関連や遅延ローディングをサポート

Seasar Conference 2007 Spring

37 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 6 – マッピング Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用





4 チューニング





5 レガシーなERモデルとの相性









6 マッピング 7 8

Seasar Conference 2007 Spring

38 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 7 – 永続コンテキスト • S2Daoの場合 – 永続コンテキストに相当するキャッシュはもたない – 常にDBに問い合わせることでシンプルさを保つ

• JPAの場合 – JPA実装が永続コンテキストを管理する – 問い合わせはキャッシュされるので、同じトランザクション内で何度も同じ エンティティにアクセス(更新、問い合わせ)する場合に効果を発揮する

Seasar Conference 2007 Spring

39 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 7 – 永続コンテキスト Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用





4 チューニング





5 レガシーなERモデルとの相性





6 マッピング







×

7 永続コンテキスト 永続コンテキスト 8

Seasar Conference 2007 Spring

40 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較 8 – ツールのサポート • S2Daoの場合 – Seasarプロジェクトが提供 • Dolteng • DBFlute • S2Dao-CodeGen

• Kuina-Daoの場合 – Seasarプロジェクトが提供 • Dolteng

– (JPAの部分に関しては)IDEが提供 • Eclipse – Dali JPA Tools

• NetBeans • JDeveloper

Seasar Conference 2007 Spring

41 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

比較結果 8 – ツールのサポート Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用





4 チューニング





5 レガシーなERモデルとの相性





6 マッピング





7 永続コンテキスト



×



×

8 ツールの ツールのサポート

Seasar Conference 2007 Spring

42 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-DaoとS2Dao – まとめ(1) Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用





4 チューニング





5 レガシーなERモデルとの相性





6 マッピング





7 永続コンテキスト



×

8 ツールのサポート



×

5 対 3 でS2Daoの勝ち?

Seasar Conference 2007 Spring

43 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-DaoとS2Dao – まとめ(2) Kuina-Dao + JPA実装

S2Dao

1 人気(ダウンロード数)

×



2 学習コスト

×



3 SQLの利用





4 チューニング





5 レガシーなERモデルとの相性





○ ○ ○



6 7 8

マッピング 永続コンテキスト 永続コンテキスト ツールの ツールのサポート

Seasar Conference 2007 Spring

× ×

44 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの使いどころ

Kuina-Daoの使いどころ

Seasar Conference 2007 Spring

45 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

2タイプのアプリケーション • 世の中のアプリケーションは2種類に分けられる – データの入出力が中心のアプリケーション – データの評価・加工が中心のアプリケーション

• 入出力が中心のアプリケーションとは? – 画面からの入力したデータをほとんどそのままバックエンドシステム(DB、 メインフレーム)にわたす – バックエンドシステム(DB、メインフレーム)から受け取ったデータをほと んどそのまま画面に出力する

• 評価・加工が中心のアプリケーションとは? – データベースに問い合わせながらあるデータを評価し、その評価に基づ いて加工を行うアプリケーション

Seasar Conference 2007 Spring

46 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

入出力中心のアプリケーションの場合 • 業務ロジックがほとんどない – バリデーションやデータの型変換などはある

• キャッシュの仕組みは不要 – 入力時は、更新メソッドを呼べばよい – 出力時は、画面に合わせて必要なデータを取得すればよい

• 2種類のマッピングがあればOK – テーブルとオブジェクトのマッピング – 任意の結果セットとオブジェクトのマッピング

プレゼン テーション

Seasar Conference 2007 Spring

ロジック

S2Dao

DB

DTOを やり取りする トランザクション境界

47 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

評価・加工が中心のアプリケーションの場合 • 同一テーブルの同一レコードがトランザクション内で複数のロジックにまた がって何度もアクセスされる – 必要毎のDBアクセスは避けたい→永続 永続コンテキスト 永続コンテキストでのキャッシュ コンテキスト

• 同一テーブルの同一レコードがトランザクション内でさまざまに変更される – 変更毎のDBアクセスは避けたい→コミット時の永続 永続コンテキスト 永続コンテキストのフラッシュ コンテキスト

• データにグループ化や階層構造が必要 – リレーションシップの リレーションシップのマッピング

プレゼン テーション

ロジック ロジック ロジック ロジック

Kuina-Dao

JPA実装

DB

永続コンテキスト

トランザクション境界

エンティティを管理 エンティティにアクセス

Seasar Conference 2007 Spring

48 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

評価・加工が中心のアプリケーションの例 • シミュレーション系アプリ(例えば生産管理のスケジューリング) – 一度のトランザクションで何度も変更されるエンティティ • • • •

所要量 タスク スケジュール 在庫

– 一度のトランザクションで何度もアクセスされるエンティティ • • • • • • •

スケジュール タスク リソース 能力 部品 部品構成 在庫

Seasar Conference 2007 Spring

49 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの使いどころ – まとめ • JPAが効果的なアプリケーションにはKuina-Daoも効果的 – Kuina-DaoはJPAを使いやすくするフレームワーク

• JPAの使いどころ – 永続コンテキスト • DBアクセスを減らすための仕組み(キャッシュ・コミット時のフラッシュ)が備 わっている – アプリケーションをシンプルに保てる – 管理すべきSQLを減らせる

– リレーションシップのマッピング • データのまとまりや階層構造(1対多・多対1)をロジックで扱える

– ツール(IDEやIDEのプラグインなど)のサポート • エンティティの自動生成 • エンティティの編集補完 • 設定ファイルの自動生成

評価・加工が中心ならばKuina-Daoで 入出力中心ならばS2Daoで決まり? Seasar Conference 2007 Spring

50 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの使いどころ アドバンスド

Kuina-Daoの使いどころ アドバンスド

Seasar Conference 2007 Spring

51 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

S2Daoで入出力中心のアプリケーション

プレゼン プレゼン プレゼン プレゼン テーション プレゼン テーション プレゼン テーション プレゼン テーション プレゼン テーション テーション テーション テーション

ロジック

S2Dao

DB

トランザクション境界

DTOを やり取りする

• DTOの管理が煩雑 – 画面が増えると対応してDTOとDAOが増える

Seasar Conference 2007 Spring

52 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoで入出力中心のアプリケーション

プレゼン プレゼン プレゼン プレゼン テーション プレゼン テーション プレゼン テーション プレゼン テーション プレゼン テーション テーション テーション テーション

ロジック

Kuina-Dao

JPA実装

DB

永続コンテキスト

エンティティを管理 トランザクション境界

エンティティを表示

• エンティティをそのまま表示すればOK – 画面が増えてもDTOを管理する必要がない。でも… Seasar Conference 2007 Spring

53 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

遅延ローディングにどう対応するか a. b. c. d. e.

あらかじめアクセスしておく フェッチタイプをEagerに設定しておく Transaction View Entity Manager per Request DTOに変換

Seasar Conference 2007 Spring

54 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

遅延ローディングにどう対応するか ‐ ベストプラクティス

• フェッチタイプはすべてLazyに設定しておく – @ManyToOne(fetch = FetchType.LAZY)

• 必要なものだけFetch Joinで取得する – Kuina-Daoでは簡単にFetch Joinするための仕組みを提供 • @Distinct @FetchJoin(joinSpec = JoinSpec.LEFT_OUTER_JOIN, value = “emps”) List findByLoc(String loc);

– もちろんJPQLを書いてもOK • SELECT DISTINCT dept FROM Dept AS dept LEFT OUTER JOIN FETCH dept.emps WHERE (dept.loc = :loc)

Seasar Conference 2007 Spring

55 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの使いどころ アドバンスド – まとめ @FetchJoinで必要なエ ンティティだけを取得

プレゼン プレゼン プレゼン プレゼン テーション プレゼン テーション プレゼン テーション プレゼン テーション Teedaの テーション テーション テーション Pageクラス

ロジック

Kuina-Dao

JPA実装

DB

永続コンテキスト

エンティティを管理 トランザクション境界

エンティティを表示

エンティティを直接参照する形は今後Teedaがサポート

Seasar Conference 2007 Spring

56 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

ロードマップ

ロードマップ

Seasar Conference 2007 Spring

57 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Dao関連プロダクトのロードマップ • 現在 – 2007年5月 S2TopLink-JPA 1.0-r3 リリース – 2007年5月 S2Hibernate-JPA 1.0 リリース – 2007年5月 Kuina-Dao 1.0 リリース

• 予定 – 2007年9月 S2TopLink-JPA 1.0 リリース予定 – 2007年x月 S2OpenJPA 1.0 リリース予定 – 2007年x月 S2Cayenne-JPA 1.0 リリース予定 皆さんの要望 さんの要望を 要望を受け付けています! けています! Seasar Conference 2007 Spring

58 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

Kuina-Daoの関連情報 • ドキュメント – http://kuina.seasar.org/ja/

• 書籍 – Java Expert #01

• http://www.amazon.co.jp/Java-Expert-01-編集部/dp/4774130702/ • メーリングリスト – Seasar userメーリングリスト • [email protected]

– JPAメーリングリスト • [email protected]

• サンプル(テストコード) – SVNリポジトリ • https://www.seasar.org/svn/kuina/trunk/kuina-dao-it

• ツール – Dolteng(どぅるてん)

• http://www.seasar.org/wiki/index.php?Dolteng Seasar Conference 2007 Spring

59 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.

ありがとうございました

ありがとうございました

Seasar Conference 2007 Spring

60 Copyright© 2004-2007 The Seasar Foundation and the others. All rights reserved.