「Seam Generate Entities」の続きです。最初テーブル側にFK制約を付けない状態の2テーブルに対して自動生成を実行し、それを1-N関連になるようにカスタマイズをしていました。いろいろ格闘してたんですが、ちょっと冷静になりFK制約をつけた状態で生成しなおすと。。。バッチリです!
AUTHOR-BOOKの1-N関連のDDLです(HSQLです)。
CREATE TABLE AUTHOR(ID BIGINT NOT NULL PRIMARY KEY,NAME VARCHAR(20)) CREATE TABLE BOOK(ID BIGINT NOT NULL PRIMARY KEY,NAME VARCHAR(30),AUTHORID BIGINT,FOREIGN KEY (AUTHORID) REFERENCES AUTHOR(ID));
ここから「Seam Generate Entities」すると
- AUTHORの検索画面
- BOOKの登録画面。関連するAUTHORを検索画面から決定できる
- AUTHORの1件詳細画面。関連するBOOKも表示します。
ちょっとカスタマイズしてみましょう。
BOOKの検索画面にAUTHORIDが出てるのはイケてないですね。
BookList.xhtmlを修正します。エディタのプレビューのほうから直したいところをクリックして直接修正できます。
book.author.idをbook.author.nameに修正するだけでした
それからBOOKの登録画面で「Select author」ボタンからAUTHOR選択画面に行って戻ってくると、入力していたフィールドがクリアされているのが気になりました。せっかくエンティティ使ってるんだから覚えておいて欲しいですよね。「Select author」ボタンが
<s:decorate id="authorDecoration" template="layout/edit.xhtml"> <ui:define name="label">author</ui:define> <h:commandButton value="Select author" id="selectAuthor" action="#{bookHome.selectAuthor}" /> </s:decorate>
アクションとしてselectAuthorメソッドを作ってリダイレクトします(もっとスマートなやり方があるかなあ)。
public String selectAuthor() { return "/AuthorList.xhtml?from=BookEdit"; }
これで遷移しても、入力フォームの値がエンティティにキャッシュされています。画面レイアウトとしてもこっちのほうがいいんじゃない?
実際のところはテーブルからの生成より、エンティティからの生成のほうがSeamのスタイルでしょう。でもテーブルに対応したアノテーションの付け方、CRUD画面の作り方のサンプルとしてはかなり参考になります。