Life読んだ本や、プログラミング、システム開発等のねたを中心に。文章を書く練習なので少し硬派に書くつもりだけど、どうなることやら。この広告は、90日以上更新していないブログに表示しています。JPAMementoWeaver開発記(11)前回はJPAのEntityManagerを用いて単一のテーブルへのInsert(Persist)を実装したが、関連のある複数テーブルに跨る操作は未実装だった。今回は関連のある複数テーブルの参照を実装する。大まかな方針として、以下の段取りですすめる。Derby上のテーブル間のリレーションを実装する。Daliを用いてDerbyテーブルからEntity群をリバース生成する。生成されたEntity群を用いて処理(具体的には、Material(親)とTaggedMaterial(子)に格納された情報を取得)する。Derby上のテーブル間のリレーションを実装するまずは設計上のERを再確認。リレーションは3本引かれているが、意味的には以下の2本。素材[Material](1..1)----(0..m)タグ付素材[TaggedMaterial]タグ付素材[TaggedMaterial](1..m)----(0..m)メメント[Memento]ただし、2番目のリレーションはm:mなので関係テーブル(MementoContents)を配置して以下の形式にしているのみ。TaggedMaterial(1..1)----(1..m)MementoContents(1..m)----(1..1)MementoERMasterから生成したDDLは以下のような形になる(関連箇所のみ抜粋)。このDDLを実行してDerby上にテーブルと関連を実装する。RESTRICT;Daliを用いてDerbyテーブルからEntity群をリバース生成する。次にDaliからEntityを再生成する。Table...を実行。Associations画面では関連を(手動で?)定義するのだが、Daliが既に外部キー制約をみて初期値を設定してくれている。Dali的にはTaggedMaterialとMementoの間はm:m(ManyToMany)の関係として認識してくれている。個人的には親テーブル(Material)が右側に表現されているのが気持ち悪いが、問題なさそうなのでNext。自動生成キーの設定や、DBフィールド名とJavaフィールド名のマッピングなどを確認し、Finish生成されたEntityはこのような感じになる。(抜粋)Material.java子エンティティであるTaggedMaterialのListに関するアクセサまでが定義されている。Detailビューからプルダウンできる。taggedMaterial;}}TaggedMaterial.javaMementoとの関係テーブルは、@JoinTableアノテーションで表現してくれている。material;}}Memento.javaTaggedMaterialとの関連については、@JoinTableなどは定義されていない様子。これでよいのだろうか?メメント周りの実装時の確認事項としておく。taggedMaterials;}}生成されたEntity群を用いた処理MaterialテーブルへのInsert親テーブルのみへのInsertならば前回にも記載した内容と基本的には一緒。若干リファクタリングしたが、手直し自体は発生していない。PersistenceManagerにインストール状況の登録を要求em.getTransaction().begin();em.persist(materialEntity);em.getTransaction().commit();em.close();Materialテーブル、TaggedMaterialテーブルからの検索(CriteriaQuery使用)MaterialStateがMATERIAL_STATE_INSTALLEDなMaterialのみをMaterialテーブルより検索する。関連するTaggedMaterialについては全件を取得する。例によって新し物好きなので、CriteriaQueryを使用してみる。Material表を検索し、installedされている素材の一覧を取得する。TaggedMaterial表を検索し、設定されているタグの一覧を取得する。Entity間で関連をはっているので、materialから辿ることができる。}}どうも変数名の付け方とかはまだ気に喰わないのでこっそり直すかもしれないが、行っていることは大まかに以下の流れになっている。=>Rootオブジェクトquery.select()に先ほどのRootオブジェクトを渡すquery.where()で各種検索条件等を設定EntityManagerにqueryを渡して実行どうもCriteriaとかRootとかがまだ腹に落ちていない感じがする。Rootって名前と射影が頭の中で結びつかないからかな。API関連を整理する*1。*1:JavaFXのほうも整理しないと駄目なんだけどなかなかJPAから離れられない...。»プロフィールid:kazyury読んだ本や、プログラミング、システム開発等のねたが中心です。ここでは硬派にと思ってるけど、どうなるかなぁ。(1)はてなブログをはじめよう!kazyuryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。