ウィジェットはじめにこの連載は、JPAについて、書籍「わかりやすいJavaEE」の内容を補完するために書き下ろしました。JPQL、エンティティグラフ、ロック機構などについて解説します。18章のJPQLについての解説を先に読んでおくといいかもしれません。2013)のサポートサイトにあるツールとデータベースを使います。原本はサーブレットでしたが、簡単に実行できるようにJSFアプリケーションに直し、NetBeans用のプロジェクトファイルにしました。解説を読む前に、ダウンロードして手元で実行できるようにしておいてください。次のリンクからプロジェクトファイルをダウンロードできます。・JpqlTestのダウンロードただし、プロジェクトを実行する前に以下の手順を実行しておいてください。手順を実行した解説ビデオもあります。(手順1)プロジェクトを実行する前に、データベースを作成するダウンロードしたJpqlTest.zipを適切な場所に解凍する。内容はJpqlTextプロジェクトとdb.sqlです。接続]のドロップダウンボックスをクリックし、データベース接続を選ぶ。3.でクリックした普段使っているデータベース接続を選択するとよい。[SQLの実行]ボタンを押す(手順2)永続性ユニットを作成するJpqlTestプロジェクトを右クリックし、[新規]⇒[その他]と選択する新規ファイルダイアログの左欄で[持続性]、右欄で[持続性ユニット]を選択して、[次へ]を押す[New持続性ユニット]で、[データソース]欄に適切なデータソースを指定して[終了]を押す。データソースは、db.sqlでテーブルとデータを作成したデータベースに関連づけられているものを選択する。(「わかりやすいJavaEE」ではjdbc/mydbでした)JpqlTestで操作できるエンティティ(ドメインモデル)まず操作対象とするエンティティについて、理解しておきましょう。JpqlTestが扱うエンティティのセット(ドメインモデルといいます)は、Employeeエンティティを中心に5つあります。次の図を見て、関係を把握しましょう(下記の説明を参照)。基本項目に加えて、address(住所記録)、phones(所有するすべての電話)、department(部署)、manager(直属の上司)、direct(統括するすべての部下)、project(所属するプロジェクトチーム)などがあります。その他のエンティティEmployeeのメンバを順に見ていけば、すぐに関係が理解できます。addressaddressはAddressエンティティを参照する一方向のOne-To-Oneの関係です。一方向であることを示すために、矢印は片側にだけ付けています。これ以外のオブジェクトメンバは全て双方向です。phonesphonesは所有する電話のリストで、複数の電話番号をもっているため、PhoneエンティティのemployeesとOne-To-Manyの関係です。departmentdepartmentは所属部署です。同じ部署には複数の社員が所属するので、DepartmentエンティティのemployeesとMany-To-Oneの関係です。managermanagerは直属の上司を表します。ManegerがEmployee型であることに注意してください。一人のmanagerに複数の部下がいるので、EmployeeエンティティのdirectとMany-To-Oneの関係です。directdirectは直属の部下を表しています。同じEmployeeエンティティのmanagerとOne-To-Manyの関係になります。このように、Employeeエンティティの中に、Employee型にもとづく関係があっても何ら問題ありません。projectprojectは所属するプロジェクトチームを表します。一人の社員が複数のプロジェクトに所属する一方、ひとつのプロジェクトには複数の社員が所属するので、これはProjectエンティティのemployeesとMany-To-Manyの関係です。※データベースには、この他ProjectのサブクラスであるDesigenProjectエンティティとQualithProjectエンティティが含まれています。データベースから、該当するデータを一括して抽出する命令文です。その一般的な形式は次のようです。SELEC句には実行結果の形式を指定し、FROM句には検索する対象のエンティティを指定します。BY(並び順)は、必要なければ省略可能できます。簡単なSELECT文は次のようです。e出力結果(JpqlTestの[SELECT1]ボタンで実行できます。]※EmployeeクラスのtoStringメソッドで、上の出力形式を指定しています。他のエンティティでも同じですので、一度、確認しておいてください。JPQLはSQLと似ていますが、SQLがデータベーステーブルを対象とするのに対して、JPQLはエンティティを対象とする点が大きな違いです。variable)といい、Employeeエンティティのエイリアスです。Entityの全体を意味するので、実行するとEmployeeオブジェクト全体を取得できます。データベーステーブルでは全てのカラムということになります。このSELECT文を実行した結果は、エンティティマネージャーのgetResultListメソッド(後のページで解説)を使って、EmployeeエンティティのListとして取得できます。JPQLはSQLに変換して実行されるJPQLは、SQLに変換して実行されるので、実行の際、どのようなSQLに変換されるか、知っておくと、無駄なクエリをたくさん発行してパフォーマンスが低下するという事態をさけることができます。そこで、永続性ユニット(persistence.xml)に次の2行を追加しておきましょう。これで、サーバーログの中に、SQLの実行ログが表示されるようになります。)を付けるとそのメンバを指定できます。Expression)と言います。ee.nameは、Employeeのメンバであるnameを指します。JpqlTestを実行して、[SELECT4]というボタンを押してみてください。このボタンは、上のクエリを実行し、結果を表示します。結果として次のような名前の文字列を取得していることがわかるはずです。]ドメインモデルで説明したように、Employeeクラスには単純なフィールド変数以外に、あらゆるオブジェクト関係マッピングを持つフィールドがありました。ように、Addressエンティティのメンバもアクセスできます。Adressクラスのメンバは、ドメインモデルの図を見てください(ソースコード全体は、ダウンロードしたJpqlTestプロジェクトにあります)。そこで、つぎのようなSELECT文を実行してみましょう。eJpqlTest画面の最上段にある入力領域の枠内にこのSELECT文を書いて、[dynamic]ボタンをクリックすると、次のように表示されます。確かに、Addressエンティティのフィールドから値を取得していることが分かります。]このように、パス式はとても強力です。可能な限りどこまでもオブジェクトの連鎖(オブジェクトグラフといいます)をたどることができます。データベースでは、実際にはいくつかのテーブルにまたがる操作ですが、オブジェクトの考え方だけで、簡単に記述できるのは大きな利点です。パス式を使うとデータベース側ではいくつものテーブルに対するSQL文が発行されます。そのため、場合によっては検索がひどくスピードダウンしてしまいます。実際にはどのようなSQLが実行されているか、GlassFishサーバーログを見て、常々、確認するようにしてください。FETCH(第5回)、エンティティグラフ(第8~10回)で解説します。List)のように多くの要素を持つメンバは、遅延フェッチ(L...記事を読むテキストファイルの入出力を簡単にしよう(2)今回は、テキストファイルの出力を簡単にするTextWriterです。前回は、エンティティグラフを実装しましたが、SQLの生成に問題がありました。エンティティグラフはクエリの実行時に、付加的な情報としてクエリにセットします。前回までは、一斉送信やファイル添付メールの送信方法を解説しました。eコマースなどでは、海外のからも読めるように、日本語の他、英語やドイツ語などの表示に対応する必要があります。インストールせずに、解凍するだけで起動できるNetBeansです。前回は、ライブラリのダウンロードと、基本的なメール送信について解説しました。これは「わかりやすいJPA」の7回目です。これはJPAを解説する連載の4回目です。AM表結合が簡単な記述でできるのですね。ログの取得方法の記載も助かります。実際にどんなSQLが実行されているかは気になるところです。プロジェクトをダウンロードして試してみました。Mysql環境ですが動かすことができました。1点気になったのですが、オリジナルのデータソース定義(jdbc/jpql)が残っていますので、持続性ユニット作成のウィザードでデータソースの選択肢に出てきてしまいます。防ぐには、ファイルタブのsetup配下に有るglassfish-resources.xmlファイル内のエントリを削除すれば良いです。PMありがとうございます。解説ビデオも付けました。PM早速の対応、有難うございました。動画まで作成頂き、お疲れ様でした。コメントをキャンセルメールアドレスが公開されることはありません。Reserved.%d人のブロガーが「いいね」をつけました。