SlideShare una empresa de Scribd logo
1 de 26
App Engine for Java の JDO
使用上の考慮点

   (株)ケーピーエス 平 克介
目次
   RDB から JDO への実装の変更概要
       今回トライした例について
   JDO の基本
   考慮点 –  Transaction
   考慮点 – 関連
   考慮点 –  PersistenceManager
   考慮点 –  Index

           参考:基本情報技術者試験 午前問題特訓システム
KPS フレームワークの機能
    クライアントから直接擬似 HibernateAPI を操作
        ORM オブジェクトを検索、更新、作成、削除
    クライアントからサーバー側 Sesar2 コンポーネン
     トの呼び出し
    Gxt   GUI 画面デザインツール  D-RexGxt


                                  Hibernate 部分を
                                  JDO へ入れ替え




Criteria を Query              集計処理部分の 
      へ変更                        変更
JDO への移行
   サーバー側の ORM アクセス部分の変更
       Hibernate から JDO へ
           フレームワーク側の変更
   クライアント側検索 API の変更
       Criteria から Query へ
           フレームワークおよびクライアントコードの変更
   集計処理部分の変更
       集計処理を行っている Seaser2 コンポーネントの
        変更
JDO の基本1
   JDO とは
       Java 標準のデータの永続化・検索機能を提供す
        る API
   JDO の ORM クラス( GAE では kind と呼
    ぶ)
    @PersistenceCapable(identityType = IdentityType.APPLICATION)
    public class Employee {
      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Long id;
      @Persistent
      private String firstName;
      @Persistent
      private String lastName;                この下に constructor
              :                                getter/setter が続く
JDO の基本 2

   Object(entity) を永続化する


       PersistenceManager pm = PMF.get().getPersistenceManager();
       Employee e = new Employee("Alfred", "Smith", new Date());
       try {
           pm.makePersistent(e);
       } finally {
           pm.close();
       }
            :
JDO の基本 3
   Object の更新
     PersistenceManager pm = PMF.get().getPersistenceManager();
     try {
         Employee e = pm.getObjectById(Employee.class, 1);
          e.setTitle(newTitle);
     } finally {
         pm.close();
     }
        :

   Object の削除
       pm.deletePersistent(e);
           :
JDO の基本 4
   Object の検索
    Query query = pm.newQuery(Employee.class);
    query.setFilter("lastName == lastNameParam");
    query.setOrdering("hireDate desc");
    query.declareParameters("String lastNameParam");
    try {
        List<Employee> results = (List<Employee>) query.execute("Smith");
        if (results.iterator().hasNext()) {
            for (Employee e : results) {
                // ...
            }
        } else {
            // ... no results ...           Where lastName=‘Smith’
        }                                    Order by hireDate desc
    } finally {                                      に相当
        query.closeAll();
    }            :
JDO の基本 5
    Transaction
    Transaction tx = pm.currentTransaction();
    try {
        tx.begin();
        ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
        members.incrementCounterBy(1);
        pm.makePersistent(members);
        tx.commit();
    } finally {
        if (tx.isActive()) {     Tx 間に他所で同じ entity が更新された場
            tx.rollback();                          合
        }                         JDOOptimisticVerificationException とな
    }                                               る
              :
JDO の基本 6
   com.google.appengine.api.datastore.Key
    import com.google.appengine.api.datastore.Key;
    // ...
        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Key key;
        public void setKey(Key key) {
           this.key = key;
        }        :
       親のクラスを持つ場合は主キーに Key を使用する
       Key は親のクラスの Key への参照を持つ
           子 Key→ 親 Key
       Entity の Key は変更できない
JDO の基本 7
   関連
       Employee.java
    // ...
        @Persistent(mappedBy = "employee")
        private List<ContactInfo> contactInfoSets;
       ContactInfo.java
    // ...
        @Persistent
        private Employee employee;
        Employee:Contactinfo = 1:N
       この場合 Employee が Contactinfo の親になる
       共通の親(親の親も含む)を持つ entity の集合を entity
        group と言う
参考資料
   ORM クラス間の一般的な関連の実装方法
                       RDB の場合:主キー / 外部キーの関連
     商品テーブル
                                            外部キ
      商品 CD     商品名        単価      商品メーカー CDー

                                               商品メーカーテーブル
                                   商品メーカー CD 商品メーカー名
    関連相手の Object                   主キー
     の参照を持つ                                                          関連相手の Object
                                                                     の集合の参照を持つ
                           ORM でのオブジェクト間の関連

                 Shohin                           ShohinMaker

                                          1
              String shohinCd      0..*       String shohinMakerCd
             String shohinNm                  String shohinMakerNm
                 Long tanka                         Set shohins
         ShohinMaker shohinMaker


            getShohinMaker()                    getShohins()
考慮点 (Transaction)
   1 Transaction 内では同一の entity group に
    属する entity しか扱えない
           tx.begin();
         Query query = pm.newQuery(Employee.class);
         List<Employee> results = (List<Employee>) query.execute();
         Employee e1 = results.get(0);
         Employee e2 = results.get(1);
         e1.setFirstName(e1.getFirstName() + "1");
         e2.setFirstName(e2.getFirstName() + "2");
         tx.commit();                         javax.jdo.JDOException
        つまり、共通の親を持つ entity しか Transaction
         化できない
考慮点 (Transaction)
   Transaction の制約を受けない方法
       単一の entity 「 root 」をすべての親の無い entity
        の親にする


                                   root


                   employee1
                     employee2
                       employee3          company1
                                              company2
         contactInfo1
          contactInfo2
                              すべては同一の entity group
考慮点 (Transaction)
   Root クラス ( 主キーだけあればよい )
    @PersistenceCapable(identityType = IdentityType.APPLICATION)
    public class Root {
      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Key key;
      public Key getKey() {
        return key;
      }
      public void setKey(Key key) {
        this.key = key;
      }
    }
考慮点 (Transaction)
   親の無い entity の例( Root の Key を持たせる )
 @PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;
  @Persistent
  @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
   private Key rootKey;
   public void setRootKey(Key rootKey) {
    this.rootKey = rootKey;
  }
}
       Root との ManyToOne 関連を持たせる方法でも OK
考慮点 (Transaction)
   親が root である Entity の新規作成
       root の key をセットする (root のキー値が1の場
        合)
    // ...
    Employee e = new Employee("Alfred", "Smith", new Date());
    Key key = KeyFactory.createKey("Root", 1);
    e.setRootKey(key);
    pm.makePersistent(e);
           :
考慮点 ( 関連 )
    関連実装時の問題(関連が Key の構造にな
     る)
         親を一度設定すると変更できない
         複数の親を定義できない
  division1          division2   2009 年春の「コンピュータの基礎」の問題

                                   season1               genre1
                     x
         employee1                                   x

Employee1 は一生 division1                      question1

                                   Season と Genre 両方親に出来ない
考慮点 7 ( 関連 - 解決策 )
     関連は親の Key を保持することで実装する
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Question {
           @PrimaryKey
           @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
           private Key key;
           @Persistent
           private Key seasonKey;
           @Persistent                                   関連先 Object を要求された時
           private Key genreKey;
                                                                  に entity を読む
           public Season getSeason() {
                      if (this.seasonKey == null) {
                                  return null;
                      }
                      return getPm().getObjectById(Season.class, this.seasonKey);
           }
           public void setSeason(Season season) {
                      this.seasonKey = season.getKey();
           } :
考慮点 (PersistenceManager)
   PersistenceManager の使いまわし
       一連の処理で使用する PersistenceManager は同
        一のものを使用する必要がある。
        // ...
         Season s = question.getSeason();
         s.setCnt(s.getCnt()+1);
         pm.makePersistent(s);


        public Season getSeason() {
          if (this.seasonKey == null) {
            return null;
          }
          return pm.getObjectById(Season.class, this.seasonKey);
        }
考慮点 (PersistenceManager)
   PersistenceManager を request に保持する
      public class PMManager {
      public static final String pmName = " PMManager _PM";
          public static PersistenceManager getPm() {
            HttpServletRequest request = null;
            PersistenceManager pm = null;
            try {
              request = (HttpServletRequest) SingletonS2ContainerFactory
                  .getContainer().getComponent(HttpServletRequest.class);
              pm = (PersistenceManager) request.getAttribute(pmName);
            } catch (Exception e) {
            }
            if (pm == null) {
              pm = PMF.get().getPersistenceManager();
              if (request != null) {
                request.setAttribute(pmName, pm);      この場合 Seasar2 のコンテナ
              }                                            から request を得ている
            }
            return pm;
          }
      }
考慮点 (PersistenceManager)
   PMManager から入手する例

     // ...
      Season s = question.getSeason();
      s.setCnt(s.getCnt()+1);
      PMManager.getPm().makePersistent(s);


     public Season getSeason() {
       if (this.seasonKey == null) {
         return null;
       }
       return PMManager.getPm()
                   . getObjectById(Season.class, this.seasonKey);
     }
考慮点 (Index)
   検索条件によっては明示的に Index を定義す
    る必要がある。
       Google の資料で Index 定義が必要な検索とは
           複数のソートが指定された場合
           Key の逆順ソートの場合
           == でない条件と == の条件がある場合
           == の条件と ancestor フィルターがある場合
       Local 環境で OK でも Deploy した環境で NG の場
        合がある
考慮点 (Index)
   Index の設定例
       war/WEB-INF/datastore-indexes.xml に指定

        <?xml version="1.0" encoding="utf-8"?>
        <datastore-indexes autoGenerate="false">
         <datastore-index kind="Question" ancestor="false" source="auto">
          <property name="seasonKey" direction="asc"/>
          <property name="genreKey" direction="asc"/>
         </datastore-index>
        </datastore-indexes>
その他の考慮点

   kind 間の Join による読み込みはできない
   group by を使用した集約関数は使用できない
       count(*) / sum(xxx) 等
   検索条件に  != 、 IN は使用できない
       Python ではクライアント側の実装として実現し
        ている
   検索条件の組み合わせで or 、 not は使用で
    きない
おわり

   ありがとうございました

Más contenido relacionado

La actualidad más candente

G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)Nobuhiro Sue
 
負荷テストことはじめ
負荷テストことはじめ負荷テストことはじめ
負荷テストことはじめKazumune Katagiri
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangTakeru INOUE
 
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張Ryota Murohoshi
 
OpenStack Study#9 JOSUG
OpenStack Study#9 JOSUGOpenStack Study#9 JOSUG
OpenStack Study#9 JOSUGHideki Saito
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説JPCERT Coordination Center
 
PFDS 11.2 catenable double ended queue
PFDS 11.2 catenable double ended queuePFDS 11.2 catenable double ended queue
PFDS 11.2 catenable double ended queue昌平 村山
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsFumitaka Yamada
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccMasatoshi Tada
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろTakuya Tsuchida
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについてShoichi Takagi
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方啓 小笠原
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
HTMLの要素の選び方
HTMLの要素の選び方HTMLの要素の選び方
HTMLの要素の選び方TENTO_slide
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixirk1complete
 

La actualidad más candente (20)

G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
負荷テストことはじめ
負荷テストことはじめ負荷テストことはじめ
負荷テストことはじめ
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
 
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
 
OpenStack Study#9 JOSUG
OpenStack Study#9 JOSUGOpenStack Study#9 JOSUG
OpenStack Study#9 JOSUG
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説
 
PFDS 11.2 catenable double ended queue
PFDS 11.2 catenable double ended queuePFDS 11.2 catenable double ended queue
PFDS 11.2 catenable double ended queue
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろ
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
HTMLの要素の選び方
HTMLの要素の選び方HTMLの要素の選び方
HTMLの要素の選び方
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 

Similar a Gaej Jdo

分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4AdvancedTechNight
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」Tsuyoshi Yamamoto
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングkunihikokaneko1
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
Reladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjugReladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjugHiroshi Ito
 
GDG DevFest 2020 Android data linkage info
GDG DevFest 2020 Android data linkage infoGDG DevFest 2020 Android data linkage info
GDG DevFest 2020 Android data linkage infotsutomuhayakawa
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみてinfinite_loop
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料gaaupp
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るMatsuo Keita
 

Similar a Gaej Jdo (20)

分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4分散ストリーム処理フレームワーク Apache S4
分散ストリーム処理フレームワーク Apache S4
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Project lambda
Project lambdaProject lambda
Project lambda
 
Teclab3
Teclab3Teclab3
Teclab3
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Reladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjugReladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjug
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
GDG DevFest 2020 Android data linkage info
GDG DevFest 2020 Android data linkage infoGDG DevFest 2020 Android data linkage info
GDG DevFest 2020 Android data linkage info
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
はじめてのPowerShell
はじめてのPowerShellはじめてのPowerShell
はじめてのPowerShell
 
20180123 power shell
20180123 power shell20180123 power shell
20180123 power shell
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作る
 

Último

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Último (9)

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Gaej Jdo

  • 1. App Engine for Java の JDO 使用上の考慮点 (株)ケーピーエス 平 克介
  • 2. 目次  RDB から JDO への実装の変更概要  今回トライした例について  JDO の基本  考慮点 –  Transaction  考慮点 – 関連  考慮点 –  PersistenceManager  考慮点 –  Index  参考:基本情報技術者試験 午前問題特訓システム
  • 3. KPS フレームワークの機能  クライアントから直接擬似 HibernateAPI を操作  ORM オブジェクトを検索、更新、作成、削除  クライアントからサーバー側 Sesar2 コンポーネン トの呼び出し  Gxt   GUI 画面デザインツール  D-RexGxt Hibernate 部分を JDO へ入れ替え Criteria を Query 集計処理部分の  へ変更 変更
  • 4. JDO への移行  サーバー側の ORM アクセス部分の変更  Hibernate から JDO へ  フレームワーク側の変更  クライアント側検索 API の変更  Criteria から Query へ  フレームワークおよびクライアントコードの変更  集計処理部分の変更  集計処理を行っている Seaser2 コンポーネントの 変更
  • 5. JDO の基本1  JDO とは  Java 標準のデータの永続化・検索機能を提供す る API  JDO の ORM クラス( GAE では kind と呼 ぶ) @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Employee { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String firstName; @Persistent private String lastName; この下に constructor : getter/setter が続く
  • 6. JDO の基本 2  Object(entity) を永続化する PersistenceManager pm = PMF.get().getPersistenceManager(); Employee e = new Employee("Alfred", "Smith", new Date()); try { pm.makePersistent(e); } finally { pm.close(); } :
  • 7. JDO の基本 3  Object の更新 PersistenceManager pm = PMF.get().getPersistenceManager(); try { Employee e = pm.getObjectById(Employee.class, 1); e.setTitle(newTitle); } finally { pm.close(); } :  Object の削除 pm.deletePersistent(e);        :
  • 8. JDO の基本 4  Object の検索 Query query = pm.newQuery(Employee.class); query.setFilter("lastName == lastNameParam"); query.setOrdering("hireDate desc"); query.declareParameters("String lastNameParam"); try { List<Employee> results = (List<Employee>) query.execute("Smith"); if (results.iterator().hasNext()) { for (Employee e : results) { // ... } } else { // ... no results ... Where lastName=‘Smith’ } Order by hireDate desc } finally { に相当 query.closeAll(); } :
  • 9. JDO の基本 5  Transaction Transaction tx = pm.currentTransaction(); try { tx.begin(); ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345"); members.incrementCounterBy(1); pm.makePersistent(members); tx.commit(); } finally { if (tx.isActive()) { Tx 間に他所で同じ entity が更新された場 tx.rollback(); 合 } JDOOptimisticVerificationException とな } る :
  • 10. JDO の基本 6  com.google.appengine.api.datastore.Key import com.google.appengine.api.datastore.Key; // ... @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; public void setKey(Key key) { this.key = key; } :  親のクラスを持つ場合は主キーに Key を使用する  Key は親のクラスの Key への参照を持つ  子 Key→ 親 Key  Entity の Key は変更できない
  • 11. JDO の基本 7  関連  Employee.java // ... @Persistent(mappedBy = "employee") private List<ContactInfo> contactInfoSets;  ContactInfo.java // ... @Persistent private Employee employee;  Employee:Contactinfo = 1:N  この場合 Employee が Contactinfo の親になる  共通の親(親の親も含む)を持つ entity の集合を entity group と言う
  • 12. 参考資料  ORM クラス間の一般的な関連の実装方法 RDB の場合:主キー / 外部キーの関連 商品テーブル 外部キ 商品 CD 商品名 単価 商品メーカー CDー 商品メーカーテーブル 商品メーカー CD 商品メーカー名 関連相手の Object 主キー の参照を持つ 関連相手の Object の集合の参照を持つ ORM でのオブジェクト間の関連 Shohin ShohinMaker 1 String shohinCd 0..* String shohinMakerCd String shohinNm String shohinMakerNm Long tanka Set shohins ShohinMaker shohinMaker getShohinMaker() getShohins()
  • 13. 考慮点 (Transaction)  1 Transaction 内では同一の entity group に 属する entity しか扱えない    tx.begin(); Query query = pm.newQuery(Employee.class); List<Employee> results = (List<Employee>) query.execute(); Employee e1 = results.get(0); Employee e2 = results.get(1); e1.setFirstName(e1.getFirstName() + "1"); e2.setFirstName(e2.getFirstName() + "2"); tx.commit(); javax.jdo.JDOException  つまり、共通の親を持つ entity しか Transaction 化できない
  • 14. 考慮点 (Transaction)  Transaction の制約を受けない方法  単一の entity 「 root 」をすべての親の無い entity の親にする root employee1 employee2 employee3 company1 company2 contactInfo1 contactInfo2 すべては同一の entity group
  • 15. 考慮点 (Transaction)  Root クラス ( 主キーだけあればよい ) @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Root { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; public Key getKey() { return key; } public void setKey(Key key) { this.key = key; } }
  • 16. 考慮点 (Transaction)  親の無い entity の例( Root の Key を持たせる ) @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Employee { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true") private Key rootKey; public void setRootKey(Key rootKey) { this.rootKey = rootKey; } }  Root との ManyToOne 関連を持たせる方法でも OK
  • 17. 考慮点 (Transaction)  親が root である Entity の新規作成  root の key をセットする (root のキー値が1の場 合) // ... Employee e = new Employee("Alfred", "Smith", new Date()); Key key = KeyFactory.createKey("Root", 1); e.setRootKey(key); pm.makePersistent(e); :
  • 18. 考慮点 ( 関連 )  関連実装時の問題(関連が Key の構造にな る)  親を一度設定すると変更できない  複数の親を定義できない division1 division2 2009 年春の「コンピュータの基礎」の問題 season1 genre1 x employee1 x Employee1 は一生 division1 question1 Season と Genre 両方親に出来ない
  • 19. 考慮点 7 ( 関連 - 解決策 )  関連は親の Key を保持することで実装する @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Question { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent private Key seasonKey; @Persistent 関連先 Object を要求された時 private Key genreKey; に entity を読む public Season getSeason() { if (this.seasonKey == null) { return null; } return getPm().getObjectById(Season.class, this.seasonKey); } public void setSeason(Season season) { this.seasonKey = season.getKey(); } :
  • 20. 考慮点 (PersistenceManager)  PersistenceManager の使いまわし  一連の処理で使用する PersistenceManager は同 一のものを使用する必要がある。 // ... Season s = question.getSeason(); s.setCnt(s.getCnt()+1); pm.makePersistent(s); public Season getSeason() { if (this.seasonKey == null) { return null; } return pm.getObjectById(Season.class, this.seasonKey); }
  • 21. 考慮点 (PersistenceManager)  PersistenceManager を request に保持する public class PMManager { public static final String pmName = " PMManager _PM"; public static PersistenceManager getPm() { HttpServletRequest request = null; PersistenceManager pm = null; try { request = (HttpServletRequest) SingletonS2ContainerFactory .getContainer().getComponent(HttpServletRequest.class); pm = (PersistenceManager) request.getAttribute(pmName); } catch (Exception e) { } if (pm == null) { pm = PMF.get().getPersistenceManager(); if (request != null) { request.setAttribute(pmName, pm); この場合 Seasar2 のコンテナ } から request を得ている } return pm; } }
  • 22. 考慮点 (PersistenceManager)  PMManager から入手する例 // ... Season s = question.getSeason(); s.setCnt(s.getCnt()+1); PMManager.getPm().makePersistent(s); public Season getSeason() { if (this.seasonKey == null) { return null; } return PMManager.getPm() . getObjectById(Season.class, this.seasonKey); }
  • 23. 考慮点 (Index)  検索条件によっては明示的に Index を定義す る必要がある。  Google の資料で Index 定義が必要な検索とは  複数のソートが指定された場合  Key の逆順ソートの場合  == でない条件と == の条件がある場合  == の条件と ancestor フィルターがある場合  Local 環境で OK でも Deploy した環境で NG の場 合がある
  • 24. 考慮点 (Index)  Index の設定例  war/WEB-INF/datastore-indexes.xml に指定 <?xml version="1.0" encoding="utf-8"?> <datastore-indexes autoGenerate="false"> <datastore-index kind="Question" ancestor="false" source="auto"> <property name="seasonKey" direction="asc"/> <property name="genreKey" direction="asc"/> </datastore-index> </datastore-indexes>
  • 25. その他の考慮点  kind 間の Join による読み込みはできない  group by を使用した集約関数は使用できない  count(*) / sum(xxx) 等  検索条件に  != 、 IN は使用できない  Python ではクライアント側の実装として実現し ている  検索条件の組み合わせで or 、 not は使用で きない
  • 26. おわり  ありがとうございました