Your SlideShare is downloading. ×
0
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Java EE 6 かんたんO/Rマッピング JPA2.0入門
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java EE 6 かんたんO/Rマッピング JPA2.0入門

11,161

Published on

Java EE 6のO/Rマッピング仕様であるJPAに関してご説明します。アプリケーションのデータアクセス層をかんたんに開発することができます。また、Oracle WebLogic Server 12cやOEPE 12cと連携した、JPA開発を解説いたします。 …

Java EE 6のO/Rマッピング仕様であるJPAに関してご説明します。アプリケーションのデータアクセス層をかんたんに開発することができます。また、Oracle WebLogic Server 12cやOEPE 12cと連携した、JPA開発を解説いたします。

日本オラクル株式会社
Fusion Middleware事業統括本部 ソリューション本部
松林 晶

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
11,161
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
74
Comments
0
Likes
13
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. <Insert Picture Here>第24回WebLogic Server勉強会@東京「Java EE 6 かんたんO/Rマッピング JPA2.0入門」日本オラクル株式会社 Fusion Middleware事業統括本部 ソリューション本部シニアセールスコンサルタント 松林 晶
  • 2. 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。 Copyright© 2012, Oracle. All rights reserved. 2
  • 3. Java EE 6 かんたんO/Rマッピング JPA2.0入門 Agenda1. JPAとは2. JPA2.0新機能3. JPAかんたん開発(DEMO) (with Oracle Enterprise Pack for Eclipse) Copyright© 2012, Oracle. All rights reserved. 3
  • 4. Java EE 6 かんたんO/Rマッピング JPA2.0入門JPAとは Copyright© 2012, Oracle. All rights reserved. 4
  • 5. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JPAとは• O/Rマッピングの仕様です • データベースのテーブルのレコードをJavaのオブジェクトに相互変換 • Javaのオブジェクトにアクセスし、データベース操作可能 •参照 •挿入 JavaApp •更新 Object Database •削除 マッピング(自動で相互変換) Copyright© 2012, Oracle. All rights reserved. 5
  • 6. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JPAとは• JPA以外のO/Rマッピングフレームワーク # 名称 1 Hibernate 2 myBatis(旧iBatis) 3 Entity Bean(EJB2.*) Copyright© 2012, Oracle. All rights reserved. 6
  • 7. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JDBCプログラミング package jdbc; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement;• O/Rマッピングフレームワークを使用しない場合の import java.sql.ResultSet; import java.sql.SQLException; import model.Employee; JDBCプログラミング例(参照系の処理) public class MainJDBC { • JDBCドライバクラスの指定 public static void main(String[] args) { Connection con = null; • コネクションの確保及びクローズ処理 PreparedStatement stm = null; try { • クエリー文の記述 Class.forName(“oracle.jdbc.OracleDriver”); con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "HR", "hr"); • エラーハンドリング stm = con.prepareStatement("SELECT * FROM Employees e WHERE e.EMPLOYEE_ID = ?"); stm.setInt(1, 100); • Beanオブジェクトへの値の設定(O/Rマッピング) ResultSet rSet = stm.executeQuery(); if (rSet.next()) { Employee emp = new Employee(); emp.setEmployeeId(rSet.getLong("EMPLOYEE_ID")); emp.setLastName(rSet.getString("LAST_NAME")); emp.setFirstName(rSet.getString("FIRST_NAME")); emp.setEmail(rSet.getString("EMAIL")); emp.setPhoneNumber(rSet.getString("PHONE_NUMBER")); emp.setHireDate(rSet.getDate("HIRE_DATE")); emp.setJobId(rSet.getString("JOB_ID")); emp.setSalary(BigDecimal.valueOf(rSet.getLong("SALARY"))); emp.setCommissionPct(BigDecimal.valueOf(rSet.getLong("COMMISSION_PCT"))); emp.setDepartmentId(BigDecimal.valueOf(rSet.getLong("DEPARTMENT_ID"))); System.out.println(emp); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (stm != null) stm.close(); if (con != null) con.close(); 大量のコードを記述する必要あり } catch (SQLException e) { } e.printStackTrace(); } } } Copyright© 2012, Oracle. All rights reserved. 7
  • 8. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JPAの例• JPAを使用したプログラミング例 package jdbc; import javax.persistence.EntityManager; import javax.persistence.Persistence; import model.Employee; public class MainJPA { public static void main(String[] args) { EntityManager em = Persistence.createEntityManagerFactory("db").createEntityManager(); Employee emp = em.find(Employee.class, 100L); System.out.println(emp); em.close(); } } Copyright© 2012, Oracle. All rights reserved. 8
  • 9. Java EE 6 かんたんO/Rマッピング JPA2.0入門 【参考】Hibernateの例• 【参考】Hibernateを使用したプログラミング例 package jdbc; import model.Employee; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class MainHibernate { public static void main(String[] args) { SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session session = factory.openSession(); System.out.println(session.get(Employee.class , 100L)); session.close(); } } Copyright© 2012, Oracle. All rights reserved. 9
  • 10. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JPA構成要素• JPAの構成要素 Persistence Context Persistent Unit Entity (persistence.xml) Entity EntityManager Entity Database Entity 決定 Entity 生成 EntityManagerFactory Copyright© 2012, Oracle. All rights reserved. 10
  • 11. Java EE 6 かんたんO/Rマッピング JPA2.0入門 Persistence Unit• persistence.xmlに記述• データベースとの接続設定を記述• エンティティクラスの指定• トランザクションタイプの指定(RESOURCE_LOCAL/JTA)• etc Copyright© 2012, Oracle. All rights reserved. 11
  • 12. Java EE 6 かんたんO/Rマッピング JPA2.0入門 EntityManagerFactory• Persistence Unitの設定に基づき、Entity Managerのインスタンスを生成 EntityManager em = Persistence.createEntityManagerFactory("db").createEntityManager(); <persistence-unit name=“db“> <…> persistence.xml Copyright© 2012, Oracle. All rights reserved. 12
  • 13. Java EE 6 かんたんO/Rマッピング JPA2.0入門 EntityManager• データ操作及び管理の為のAPIを提供する。• ライフサイクル管理のためのAPI • persist() ⇒ エンティティクラスを永続化管理対象にする(insert/update対象にする) • remove() ⇒ エンティティクラスを削除する(delete対象にする) • refresh() ⇒ データを同期する。データベースのデータでエンティティを上書きする。 • merge() ⇒ 分離したエンティティをマージする。• 検索のためのAPI • find() , getReference()⇒ 主キーによるエンティティの検索• Query関連のAPI • createQuery() ,createNamedQuery() ,createNativeQuery()• Persistenceコンテキストの管理API • flush() ⇒ データを明示的にDBと同期する • clear() ⇒ エンティティ全てを管理対象から外す • getTransaction() ⇒ トランザクションの参照を取得 • close() Copyright© 2012, Oracle. All rights reserved. 13
  • 14. Java EE 6 かんたんO/Rマッピング JPA2.0入門 2種類のEntityManager• コンテナ管理のEntityManager ⇒ Java EEコンテナで管理 • アノテーション、DIによりEntityManagerをインスタンスを注入 • コンテナがトランザクションを管理する @PersistenceContext(unitname = “DB”) private EntityManager entityManager;• アプリケーション管理のEntityManager ⇒ アプリケーションで管理。Java SE/EEで使用 • Factoryメソッドを使用して、EntityManagerを取得 • アプリケーション側でトランザクションを管理のためのコーディングが必要 EntityManagerFactory emf = Persistence.createEntityManagerFactory(“DB"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(customer); tx.commit(); em.close(); emf.close(); Copyright© 2012, Oracle. All rights reserved. 14
  • 15. Java EE 6 かんたんO/Rマッピング JPA2.0入門エンティティのライフサイクル Copyright© 2012, Oracle. All rights reserved. 15
  • 16. Java EE 6 かんたんO/Rマッピング JPA2.0入門エンティティのライフサイクル(コード例) EntityManagerFactory emf = Persistence.createEntityManagerFactory(”DB"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); Customer customer = new Customer(); //Entityの生成 tx.begin(); em.persist(customer); //管理状態のEntity tx.commit(); //デタッチ状態になるEntity //JavaのHeapにはcustomerは存在するが、JPAの管理状態から外れデタッチ状態 //この状態でcustomerに対する操作を行った場合は、merge()で同期 em.close(); emf.close(); Copyright© 2012, Oracle. All rights reserved. 16
  • 17. Java EE 6 かんたんO/Rマッピング JPA2.0入門 Entity①• テーブルに対応したエンティティクラス • ただのPOJO(Plain Old Java Object)で作成 • @Entityアノテーション ⇒ O/Rマッピング対象のエンティティクラスであることを示す • @Idアノテーション ⇒ 主キーを示す @Entity テーブル public class Customer implements Serializable { @Id private Long id; CUSTOMER表 private String address1; ID ADDRESS1 AGE NAME TELEPHONE private long age; private String name; private String telephone; //セッタ・ゲッタ } エンティティクラス Copyright© 2012, Oracle. All rights reserved. 17
  • 18. Java EE 6 かんたんO/Rマッピング JPA2.0入門 Entity②• デフォルトのカラムの上書き @Entity public class Customer implements Serializable { @Id private Long id; @NotNull //入力必須 @Size(min = 1, max = 512) //入力サイズの変更 @Column(name = ”FULL_ADDRESS“) //デフォルトのカラム名をFULL_ADDRESSに変更 private String address1; private long age; private String name; private String telephone; //セッタ・ゲッタ } エンティティクラス Copyright© 2012, Oracle. All rights reserved. 18
  • 19. Java EE 6 かんたんO/Rマッピング JPA2.0入門 Entity③• 遅延読み込み @Entity public class Customer implements Serializable { @Id private Long id; private String address1; private long age; private String name; private String telephone; @Basic(fetch = FetchType.LAZY)//写真の取得要求があるまで遅らせる @Lob private byte[] picture; } Copyright© 2012, Oracle. All rights reserved. 19
  • 20. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JPQL• Java Persistence Query Languageの略• SQLに似たJPA用のクエリー言語• SELECT / UPDATE / DELETEなどに対応• WHERE句、ソート(ORDER BY)、集約(GROUP BY)等も可能 SELECT c FROM Customer c WHERE c.lastName = Yamada Copyright© 2012, Oracle. All rights reserved. 20
  • 21. Java EE 6 かんたんO/Rマッピング JPA2.0入門 クエリ• JPAのクエリは4種類 • 動的クエリ • アプリケーション実行時にクエリを定義 • 名前付きクエリ • 動的クエリと異なり、静的で変更できないクエリ • ネイティブクエリ • データベース固有の機能を使用するためのクエリ(SQLをそのまま使用可能) Query q = em.createNativeQuery(“SELECT * FROM T_PERSON”, Person.class); List<Person> persons = q.getResultList(); • Criteria API(JPA2.0新機能) Copyright© 2012, Oracle. All rights reserved. 21
  • 22. Java EE 6 かんたんO/Rマッピング JPA2.0入門JPA2.0新機能 Copyright© 2012, Oracle. All rights reserved. 22
  • 23. Java EE 6 かんたんO/Rマッピング JPA2.0入門JPA2.0新機能①• データアクセス制御の強化 • 楽観的ロックに加え悲観的ロックの追加 MyEntity men = new MyEntity(); em.persist(men); em.lock(men,LockModeType.PESSIMISTIC_WRITE) エンティティの悲観的ロック • 検索結果のソートとソート結果の保持 • DBレコードの連鎖削除(カスケード削除) @Entity public class Order { @OneToMany(Cascade=PERSIST, orphanRemovable=true) private List<Meisai> meisaiList; カスケード削除の指定 //... meisaiList削除時にリスト内のEntityに対応するレコ ードもDBから削除 } • JPQL演算子の追加(INDEX / CASE / TYPE、etc.) • 2次キャッシュの標準仕様化 コーディングで補っていた不足機能をより一層拡充 Copyright© 2012, Oracle. All rights reserved. 23
  • 24. Java EE 6 かんたんO/Rマッピング JPA2.0入門JPA2.0新機能②• コレクションサポートの拡充 @Embeddable public class Address { • 基本型のコレクションのテーブルへのマッピング private String zip; private String street; • 組み込み可能型コレクションのマッピング } @Entity • 多段にネストされた組み込み型もマッピング可能 public class Customer { private String id; • Map型コレクションの柔軟性向上 @ElementCollection private Set<Address> addrs; • キー、値に基本型、組み込み可能型、Entity型を利用可能 }• Criteria APIによるクエリの記述 組み込み可能型を自動で ‘Customer_addrs’ テーブルにマップ(任 • JPQLに相当するクエリをAPIベースで記述し型の安全性を確保 意にテーブルの指定も可能) キャスト時の型チェッ Criteria API による表記 ク JPQL による表記 CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Customer> query = builder.createQuery(Customer.class); SELECT c FROM Customer c Root<Customer> c = query.from(Customer.class); WHERE c.name = ‘Oracle’ query.select(c).where(builder.equal(c.get("name"), "Oracle")); 可読性を高め品質の劣化を未然に防止 Copyright© 2012, Oracle. All rights reserved. 24
  • 25. Java EE 6 かんたんO/Rマッピング JPA2.0入門JPAかんたん開発DEMO(with Oracle Enterprise Pack for Eclipse) Copyright© 2012, Oracle. All rights reserved. 25
  • 26. Java EE 6 かんたんO/Rマッピング JPA2.0入門 JPAかんたん開発DEMO• Oracle Enterprise Pack for Eclipse12.1(OEPE)を使用して Entityクラスを、定義済みのデータベースから自動生成します。 ID ADDRESS1 AGE NAME TELEPHONE 自動生成 @Entity public class Customer implements Serializable { @Id private Long id; private String address1; private long age; private String name; private String telephone; //セッタ・ゲッタ } Copyright© 2012, Oracle. All rights reserved. 26
  • 27. Copyright© 2012, Oracle. All rights reserved.
  • 28. Copyright© 2012, Oracle. All rights reserved. 28

×